diff --git a/.claude/CODE_REVIEW_GUIDE.md b/.claude/CODE_REVIEW_GUIDE.md new file mode 100644 index 0000000000..f9b6d2be37 --- /dev/null +++ b/.claude/CODE_REVIEW_GUIDE.md @@ -0,0 +1,125 @@ +# Code Review Guide + +Comprehensive review standards for both local reviews and automated CI reviews. + +## Core Review Rules + +Review using CLAUDE.md for project conventions. Be LEAN and ACTIONABLE - only provide value, avoid noise. + +- ONLY include sections when there are ACTUAL issues to report +- NO "Strengths" or praise sections +- NO "no concerns" statements (skip the section entirely) +- NO design/UI/spacing suggestions (padding, margins, colors, etc.) - you cannot see the visual design +- Reference specific file:line locations for issues +- **If no issues found**: + - Comment ONLY: "✅ **Approved** - No issues found" + - DO NOT describe what the changes do + - DO NOT list changes made + - DO NOT provide any summary or explanation + - Zero noise, zero fluff - just the approval statement + +## Review Sections + +Include ONLY if issues exist: + +### Bugs/Issues +Logic errors, potential bugs that need fixing + +### Best Practices +Violations of Swift/SwiftUI conventions or CLAUDE.md guidelines (code quality only, not design) + +### Performance +Actual performance problems (not theoretical) + +### Security +Real security vulnerabilities + +## Summary Format + +End with ONE sentence only with status emoji: +- ✅ **Approved** - [brief reason] +- âš ī¸ **Minor Issues** - [what needs fixing] +- 🚨 **Major Issues** - [critical problems] + +## Common Analysis Mistakes to Avoid + +### Mistake: Assuming Unused Code After UI Element Removal + +**Scenario**: A PR removes a visible UI element (e.g., a menu button) but leaves related parameters in the API. + +**Wrong Analysis**: +- ❌ "Parameter is unused, should be removed" +- ❌ "Remove all related infrastructure" +- ❌ Not checking where else the parameter is used + +**Correct Approach**: +1. **Trace all usages** of parameters/closures before declaring them unused +2. **Understand dual UX patterns**: iOS commonly uses button + long-press for same actions +3. **Check for multiple consumers**: A closure/parameter may serve multiple UI patterns + +**Example - Menu Button + Context Menu Pattern**: +```swift +// Component accepts menu closure +struct Widget { + let menu: () -> MenuContent + + var body: some View { + content + .toolbar { + // Visible menu button + Menu { menu() } label: { Image(...) } + } + .contextMenu { + // Long-press menu (same content!) + menu() + } + } +} +``` + +**Analysis**: +- Removing the toolbar menu button does NOT make `menu` parameter unused +- The `menu()` closure is still actively used by `.contextMenu` +- Both are valid access patterns for the same functionality + +**Key Questions to Ask**: +- Where else is this parameter/closure called in the file? +- Is this a dual-access pattern (button + long-press)? +- Was the removal intentional (UX change) or accidental? +- Are there separate flags controlling each access method? + +### Mistake: Not Understanding Conditional Rendering Flags + +**Scenario**: A component has multiple boolean flags like `allowMenuContent` and `allowContextMenuItems`. + +**Wrong Analysis**: +- ❌ "These flags serve the same purpose, consolidate them" +- ❌ Not recognizing they control different UI elements + +**Correct Approach**: +1. Each flag controls a specific UI element/pattern +2. `allowMenuContent`: Controls visible button +3. `allowContextMenuItems`: Controls long-press menu +4. They can be independently enabled/disabled + +**Example**: +```swift +// Widget with independent menu controls +LinkWidgetViewContainer( + allowMenuContent: false, // No visible button + allowContextMenuItems: true, // Long-press still works + menu: { MenuItem() } // Used by context menu only +) +``` + +## Analysis Checklist + +Before suggesting removal of "unused" code: +- [ ] Searched ALL usages in the file +- [ ] Checked for dual UX patterns (button + context menu) +- [ ] Understood purpose of each boolean flag +- [ ] Verified it's not used by multiple consumers +- [ ] Asked clarifying questions about design intent + +If unsure, ask: +> "Was removing [UI element] intentional? The [parameter] is still used by [other pattern]. Should we keep both access methods or restore the [UI element]?" diff --git a/.claude/SKILLS_MANAGEMENT_GUIDE.md b/.claude/SKILLS_MANAGEMENT_GUIDE.md new file mode 100644 index 0000000000..a78c1fc8f8 --- /dev/null +++ b/.claude/SKILLS_MANAGEMENT_GUIDE.md @@ -0,0 +1,694 @@ +# Skills & Hooks Management Guide + +Complete guide to managing, troubleshooting, and fine-tuning the progressive disclosure documentation system. + +*Last updated: 2025-01-30* + +## Overview + +This guide explains how to manage the **automated documentation system** that suggests relevant skills based on your prompts and file context. + +## đŸŽ¯ System Components + +### 1. Hooks (The Automation Layer) + +**What**: Shell scripts that run automatically at specific events +**Where**: `.claude/hooks/` +**Purpose**: Analyze prompts and suggest relevant skills + +**The 3 hooks**: +- `skill-activation-prompt.sh` - **UserPromptSubmit event** - Analyzes your prompt BEFORE Claude sees it, suggests relevant skills +- `post-tool-use-tracker.sh` - **PostToolUse event** - Tracks file edits after Claude uses Edit/Write tools +- `swiftformat-auto.sh` - **Stop event** - Auto-formats Swift files after Claude finishes + +**Configuration**: +- `skill-rules.json` - Defines keywords and patterns for skill matching + +### 2. Skills (The Documentation Routers) + +**What**: Short markdown files (~100-200 lines) that act as "smart routers" +**Where**: `.claude/skills/*/SKILL.md` +**Purpose**: Provide critical rules + quick patterns + point to comprehensive guides + +**The 4 skills**: +1. `ios-dev-guidelines` - Swift/iOS patterns → `IOS_DEVELOPMENT_GUIDE.md` +2. `localization-developer` - Localization workflow → `LOCALIZATION_GUIDE.md` +3. `code-generation-developer` - Feature flags, make generate → `CODE_GENERATION_GUIDE.md` +4. `design-system-developer` - Icons, typography, colors → `DESIGN_SYSTEM_MAPPING.md` + +### 3. Specialized Guides (The Deep Knowledge) + +**What**: Comprehensive documentation files (300-550 lines each) +**Where**: Various locations in the project +**Purpose**: Single source of truth for deep technical knowledge + +## 🔄 How the System Works + +### The Activation Flow + +``` +You type: "Add a feature flag for chat" + ↓ +[UserPromptSubmit hook runs - happens automatically] + ↓ +skill-activation-prompt.sh executes + ↓ +Reads skill-rules.json + ↓ +Checks keywords: "feature flag" ✓ matches code-generation-developer + ↓ +Outputs suggestion (Claude Code displays this): +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +đŸŽ¯ SKILL ACTIVATION CHECK +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +📚 Relevant Skill: code-generation-developer + Description: Smart router to code generation... + +💡 Consider using these skills if relevant to this task. +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + ↓ +Claude sees the suggestion and can read the skill + ↓ +Claude uses skill to route you to CODE_GENERATION_GUIDE.md if needed +``` + +### What Gets Matched + +**skill-rules.json** contains matching rules for each skill: + +```json +{ + "skills": { + "code-generation-developer": { + "promptTriggers": { + "keywords": ["feature flag", "make generate", "swiftgen"], + "intentPatterns": ["(create|add|enable).*?(feature flag|flag)"] + }, + "fileTriggers": { + "pathPatterns": ["**/FeatureDescription+Flags.swift"], + "contentPatterns": ["FeatureFlags\\."] + } + } + } +} +``` + +**Matching logic**: +1. **Keywords**: Simple word/phrase matching in your prompt +2. **Intent patterns**: Regex patterns for detecting user intent (e.g., "add.*feature flag") +3. **File path patterns**: Matches when editing specific files +4. **Content patterns**: Matches when file contains specific code patterns + +## 🔧 Troubleshooting & Fine-Tuning + +### Scenario 1: Skill Didn't Activate (False Negative) + +**Symptom**: You expected a skill to activate but it didn't + +**How to diagnose**: + +1. **Check the activation logs**: + ```bash + tail -20 .claude/logs/skill-activations.log + ``` + + Look for your prompt and see what matched: + ``` + [2025-01-30 14:23:45] Analyzing prompt: "export SVG from Figma" + No matches found + ``` + +2. **Check current keywords for the expected skill**: + ```bash + cat .claude/hooks/skill-rules.json | jq '.skills."design-system-developer".promptTriggers.keywords' + ``` + +3. **Identify missing keywords**: + - Your prompt: "export SVG from Figma" + - Current keywords: icon, figma, typography, color + - Missing: "svg", "export" + +**How to fix**: + +**Ask Claude**: +``` +"The design-system skill didn't activate when I asked about exporting SVG. +Can you add 'svg' and 'export' as keywords?" +``` + +**Or edit yourself**: +```bash +# Edit .claude/hooks/skill-rules.json +# Find design-system-developer section +# Add to keywords array: +"keywords": [ + "icon", + "figma", + "svg", // ← Add this + "export" // ← Add this +] +``` + +### Scenario 2: Skill Activated When Not Relevant (False Positive) + +**Symptom**: A skill activates too often or in wrong contexts + +**Example**: Every time you mention "text", localization-developer activates + +**How to diagnose**: + +1. **Check which keyword is causing it**: + ```bash + cat .claude/hooks/skill-rules.json | jq '.skills."localization-developer".promptTriggers.keywords' + ``` + + Result shows: `"text"` is in the keywords array + +2. **Determine if keyword is too broad**: + - "text" matches: "add text to UI", "text file", "raw text", etc. + - Too broad! Should be more specific + +**How to fix**: + +**Ask Claude**: +``` +"The word 'text' in localization-developer is too broad. +Replace it with 'localized text' and 'user-facing text'." +``` + +**Or edit yourself**: +```bash +# Edit .claude/hooks/skill-rules.json +# Before: +"keywords": ["localization", "text", "Loc."] + +# After: +"keywords": ["localization", "localized text", "user-facing text", "Loc."] +``` + +### Scenario 3: Testing Changes + +After modifying `skill-rules.json`, verify it works: + +**Method 1: Try the prompt again in conversation** +``` +"Add an SVG icon from Figma" +# Should now trigger design-system-developer +``` + +**Method 2: Check activation logs** +```bash +tail .claude/logs/skill-activations.log +# Look for: Matched: design-system-developer +``` + +**Method 3: Manual test (advanced)** +```bash +echo '{"prompt":"Add SVG from Figma"}' | .claude/hooks/skill-activation-prompt.sh +# Should output skill suggestion +``` + +## 📋 Common Adjustments + +### Add a Keyword + +**When**: You use a term that should trigger a skill but doesn't + +**Example**: Add "component" to ios-dev-guidelines + +```json +// .claude/hooks/skill-rules.json +{ + "skills": { + "ios-dev-guidelines": { + "promptTriggers": { + "keywords": [ + "swift", + "swiftui", + "viewmodel", + "component" // ← Add here + ] + } + } + } +} +``` + +**Ask Claude**: "Add 'component' as a keyword for ios-dev-guidelines" + +### Remove a Too-Broad Keyword + +**When**: A skill activates too often due to a common word + +**Example**: Remove "text" from localization-developer + +```json +// Before +"keywords": ["localization", "text", "Loc."] + +// After +"keywords": ["localization", "Loc."] +``` + +**Ask Claude**: "Remove 'text' from localization-developer keywords, it's too broad" + +### Add an Intent Pattern (Advanced) + +**When**: You want to match user actions/intents, not just keywords + +**Example**: Trigger design-system when implementing from Figma + +```json +{ + "skills": { + "design-system-developer": { + "promptTriggers": { + "intentPatterns": [ + "(add|create|use).*?(icon|image|asset)", + "(implement|build|create).*?from figma" // ← Add regex pattern + ] + } + } + } +} +``` + +**Regex explanation**: +- `(implement|build|create)` - Matches any of these action words +- `.*?` - Matches any characters in between (non-greedy) +- `from figma` - Matches this phrase + +**Ask Claude**: "When I say 'implement X from Figma', trigger design-system skill" + +### Adjust Priority + +**When**: Multiple skills match, you want to control which is suggested first + +```json +{ + "skills": { + "ios-dev-guidelines": { + "priority": "high" // Suggested first + }, + "design-system-developer": { + "priority": "medium" // Suggested second + } + } +} +``` + +**Values**: `"high"`, `"medium"`, `"low"` + +## 🔍 Diagnostic Commands + +### View Activation Logs + +```bash +# Last 20 activations +tail -20 .claude/logs/skill-activations.log + +# Watch in real-time +tail -f .claude/logs/skill-activations.log + +# Search for specific skill +grep "design-system-developer" .claude/logs/skill-activations.log +``` + +**Log format**: +``` +[2025-01-30 14:23:45] Analyzing prompt: "add feature flag" + ✓ Matched: code-generation-developer + Suggested skills: code-generation-developer +``` + +### View Current Configuration + +```bash +# All skills configuration +cat .claude/hooks/skill-rules.json + +# Pretty print +cat .claude/hooks/skill-rules.json | jq . + +# Specific skill keywords +cat .claude/hooks/skill-rules.json | jq '.skills."ios-dev-guidelines".promptTriggers.keywords' + +# All keywords for all skills +cat .claude/hooks/skill-rules.json | jq '.skills[].promptTriggers.keywords' +``` + +### Test Skill Activation Manually + +```bash +# Test a specific prompt +echo '{"prompt":"add a feature flag"}' | .claude/hooks/skill-activation-prompt.sh + +# Should output: +# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +# đŸŽ¯ SKILL ACTIVATION CHECK +# ... +# 📚 Relevant Skill: code-generation-developer +``` + +### Verify Hook Permissions + +```bash +# Hooks should be executable +ls -l .claude/hooks/*.sh + +# Should show: -rwxr-xr-x +# If not, fix with: +chmod +x .claude/hooks/*.sh +``` + +## 🎓 Advanced: Understanding skill-rules.json + +### Full Structure + +```json +{ + "skills": { + "skill-name": { + "type": "domain", // Type of skill + "priority": "high", // Suggestion priority + "description": "...", // Shown in activation message + "promptTriggers": { + "keywords": [...], // Simple word matching + "intentPatterns": [...] // Regex for intent matching + }, + "fileTriggers": { + "pathPatterns": [...], // File path glob patterns + "contentPatterns": [...] // Code pattern matching + } + } + }, + "config": { + "maxSkillsPerPrompt": 2, // Max skills to suggest at once + "logActivations": true, // Enable logging + "logPath": ".claude/logs/skill-activations.log" + } +} +``` + +### Keyword Matching (Simple) + +**Keywords**: Array of words/phrases to match in prompt + +```json +"keywords": [ + "swift", // Matches: "swift code", "Swift programming" + "feature flag", // Matches: "add a feature flag" + "Loc." // Matches: "use Loc.title" +] +``` + +**Case insensitive**: "Swift" = "swift" = "SWIFT" + +### Intent Pattern Matching (Advanced) + +**Intent patterns**: Regex for matching user actions/intents + +```json +"intentPatterns": [ + "(create|add|implement).*?(view|viewmodel|coordinator)", + "(how to|best practice).*?(swift|ios|architecture)" +] +``` + +**Examples**: +- `"(create|add).*?view"` matches: + - "create a new view" + - "add view for settings" + - "create chat view" + +**Regex cheatsheet**: +- `(word1|word2)` - Match either word +- `.*?` - Match any characters (non-greedy) +- `\\.` - Match literal dot (escaped) +- `\\(` - Match literal parenthesis (escaped) + +### File Trigger Matching + +**Path patterns**: Glob patterns for file paths + +```json +"pathPatterns": [ + "**/*.swift", // Any .swift file + "**/PresentationLayer/**", // Any file in PresentationLayer + "**/FeatureDescription+Flags.swift" // Specific file +] +``` + +**Content patterns**: Regex for code content + +```json +"contentPatterns": [ + "class.*ViewModel", // Classes ending in ViewModel + "@Published", // @Published property wrapper + "FeatureFlags\\.", // FeatureFlags usage + "import SwiftUI" // SwiftUI import +] +``` + +## đŸ› ī¸ Creating a New Skill + +### When to Create a New Skill + +Create a new skill when: +- ✅ You have a distinct domain of knowledge (e.g., testing, CI/CD, performance) +- ✅ There's comprehensive documentation to route to +- ✅ The topic comes up frequently +- ❌ DON'T create for one-off topics or rarely-used info + +### Steps to Create a New Skill + +**1. Create the specialized guide** (Level 3): +```bash +# Example: Create testing guide +touch Anytype/Sources/TESTING_GUIDE.md +# Fill with comprehensive testing documentation +``` + +**2. Create the skill** (Level 2): +```bash +mkdir -p .claude/skills/testing-developer +touch .claude/skills/testing-developer/SKILL.md +``` + +**3. Use the smart router template**: +```markdown +# Testing Developer (Smart Router) + +## Purpose +Context-aware routing to testing patterns and practices. + +## When Auto-Activated +- Working with test files +- Keywords: test, mock, unittest, xctest + +## 🚨 CRITICAL RULES +1. ALWAYS update tests when refactoring +2. NEVER skip test execution + +## 📋 Quick Reference +[Quick testing patterns] + +## 📚 Complete Documentation +**Full Guide**: `Anytype/Sources/TESTING_GUIDE.md` + +--- +**Navigation**: This is a smart router. For details, refer to TESTING_GUIDE.md. +``` + +**4. Add to skill-rules.json**: +```json +{ + "skills": { + "testing-developer": { + "type": "domain", + "priority": "medium", + "description": "Smart router to testing guide. Unit tests, mocks, XCTest patterns", + "promptTriggers": { + "keywords": ["test", "unittest", "mock", "xctest", "testing"], + "intentPatterns": ["(write|add|create).*?test"] + }, + "fileTriggers": { + "pathPatterns": ["**/*Tests.swift", "**/Mocks/**"], + "contentPatterns": ["XCTestCase", "import XCTest"] + } + } + } +} +``` + +**5. Test the new skill**: +```bash +echo '{"prompt":"write unit tests for this"}' | .claude/hooks/skill-activation-prompt.sh +# Should suggest: testing-developer +``` + +## 🚨 Common Issues & Fixes + +### Issue: Hook Not Executing + +**Symptoms**: No skill suggestions appear, logs empty + +**Diagnosis**: +```bash +# Check if hook exists +ls -l .claude/hooks/skill-activation-prompt.sh + +# Check if executable +# Should show: -rwxr-xr-x +``` + +**Fix**: +```bash +chmod +x .claude/hooks/skill-activation-prompt.sh +``` + +### Issue: Invalid JSON in skill-rules.json + +**Symptoms**: Hook fails silently, no activations + +**Diagnosis**: +```bash +# Validate JSON +jq . .claude/hooks/skill-rules.json + +# If error shown, there's invalid JSON +``` + +**Fix**: +- Check for missing commas +- Check for trailing commas in arrays/objects +- Use a JSON validator or `jq` to find the error +- Ask Claude: "Validate and fix my skill-rules.json" + +### Issue: Skill Activates But Content Not Helpful + +**Symptoms**: Right skill activates but doesn't help + +**Diagnosis**: The skill might be outdated or routing to wrong guide + +**Fix**: +1. Check the skill file: `cat .claude/skills/SKILL-NAME/SKILL.md` +2. Verify it points to the correct guide +3. Check if the guide exists and is up-to-date +4. Ask Claude: "Update the X skill to route to Y guide" + +### Issue: Too Many Skills Suggested + +**Symptoms**: Multiple skills activate for same prompt + +**Diagnosis**: Keywords overlap between skills + +**Fix**: +1. Check `maxSkillsPerPrompt` in skill-rules.json config +2. Make keywords more specific +3. Adjust priorities so most relevant skill appears first + +```json +"config": { + "maxSkillsPerPrompt": 2 // Limit to 2 skills max +} +``` + +## 📊 Monitoring & Maintenance + +### Regular Checks + +**Weekly**: +- Review activation logs for false positives/negatives +- Check if new common terms should be added as keywords + +```bash +# See most recent activations +tail -50 .claude/logs/skill-activations.log + +# Count activations by skill +grep "Matched:" .claude/logs/skill-activations.log | sort | uniq -c +``` + +**Monthly**: +- Review and update skill content +- Verify specialized guides are current +- Clean up outdated keywords + +### Log Rotation + +Logs can grow large over time: + +```bash +# Archive old logs +cd .claude/logs +tar -czf logs-$(date +%Y%m%d).tar.gz skill-activations.log +rm skill-activations.log +``` + +## đŸŽ¯ Quick Reference + +### I Want To... + +**Add a keyword**: +```bash +# Ask Claude: +"Add 'architecture' to ios-dev-guidelines keywords" + +# Or edit: +vim .claude/hooks/skill-rules.json +# Add to keywords array +``` + +**See what activated**: +```bash +tail -20 .claude/logs/skill-activations.log +``` + +**Test a prompt**: +```bash +echo '{"prompt":"your prompt here"}' | .claude/hooks/skill-activation-prompt.sh +``` + +**Check current keywords**: +```bash +cat .claude/hooks/skill-rules.json | jq '.skills."SKILL-NAME".promptTriggers.keywords' +``` + +**Fix permissions**: +```bash +chmod +x .claude/hooks/*.sh +``` + +**Validate JSON**: +```bash +jq . .claude/hooks/skill-rules.json +``` + +## 📚 Related Documentation + +- `.claude/hooks/README.md` - Complete hooks system documentation +- `.claude/skills/README.md` - Skills system overview +- `CLAUDE.md` - Main project documentation (Level 1) + +## 💡 Pro Tips + +1. **Start broad, then narrow**: Add broad keywords first, remove if too many false positives +2. **Use logs for data**: Check logs regularly to see what's activating +3. **Ask Claude for help**: Let Claude analyze logs and suggest improvements +4. **Test changes**: Always test after modifying skill-rules.json +5. **Document custom keywords**: Add comments in skill-rules.json explaining why you added specific terms + +## ✅ Checklist: System Health + +- [ ] All hooks are executable (`ls -l .claude/hooks/*.sh` shows `rwx`) +- [ ] skill-rules.json is valid JSON (`jq . .claude/hooks/skill-rules.json`) +- [ ] Logs directory exists (`.claude/logs/`) +- [ ] Recent activations visible in logs (`tail .claude/logs/skill-activations.log`) +- [ ] All 4 skills exist and are readable +- [ ] Specialized guides exist and link correctly from skills + +--- + +**Need help?** Just ask: "Check my skills system health" or "Help me troubleshoot skill activation" diff --git a/.claude/commands/codeReview.md b/.claude/commands/codeReview.md new file mode 100644 index 0000000000..9e936783df --- /dev/null +++ b/.claude/commands/codeReview.md @@ -0,0 +1,56 @@ +# Code Review Command + +Review local code changes on the current branch against the base branch (develop). + +## Usage +Run `/codeReview` on your current branch to review changes against develop. + +## Process + +### Step 1: Gather Current Branch Context +Get the current branch name, list of changed files, and full diff against develop: + +```bash +# Get current branch and changes summary +git branch --show-current +git diff --name-status develop...HEAD +git diff --stat develop...HEAD + +# Get full diff for review +git diff develop...HEAD +``` + +### Step 2: Apply Review Standards + +**Apply the shared review guidelines from:** +`.claude/CODE_REVIEW_GUIDE.md` + +Follow all core rules, review sections, common mistakes, and analysis checklist defined in that file. + +**Also consult:** +- `.claude/skills/code-review-developer/SKILL.md` - Quick reference for critical rules and workflow + +**Context adaptation for local reviews:** +- This is a local review (not a GitHub PR) +- Reference file:line locations from the git diff +- Focus on changes between current branch and develop +- Output review directly (no need to post comments) + +### Step 3: Review Focus Areas + +When analyzing the diff, pay special attention to: + +1. **Migration to @Observable**: Check that all properties are properly annotated and dependencies marked with `@ObservationIgnored` +2. **Localization**: Ensure no hardcoded strings in UI, all text uses `Loc.*` constants +3. **Feature Flags**: New features should be wrapped in `FeatureFlags.*` checks +4. **Generated Files**: Never manually edit files marked with `// Generated using Sourcery/SwiftGen` +5. **Tests & Mocks**: When refactoring, ensure tests and mocks are updated +6. **Unused Code**: After refactoring, check that old code is removed +7. **Comments**: Only add if explicitly needed (per CLAUDE.md guidelines) +8. **Dependency Injection in Structs**: Avoid using `@Injected` properties in structs - dependency resolution happens on every struct recreation. Use classes with `@Observable` instead. See [PR #4173](https://github.com/anyproto/anytype-swift/pull/4173) + +### Step 4: Output Review + +Present the review following the summary format from the shared guidelines. + +Include detailed findings for each issue category only if issues are found. diff --git a/.claude/commands/continue.md b/.claude/commands/continue.md index c72469796d..38fb6f66ce 100644 --- a/.claude/commands/continue.md +++ b/.claude/commands/continue.md @@ -1 +1 @@ -Continue \ No newline at end of file +--continue \ No newline at end of file diff --git a/.claude/commands/cpp.md b/.claude/commands/cpp.md index e51aaa5a38..cfec5b9772 100644 --- a/.claude/commands/cpp.md +++ b/.claude/commands/cpp.md @@ -1 +1,65 @@ -Commit, push, pull request +Commit, review, push, pull request + +## Usage +``` +/cpp [in branch ] +``` + +## Description +Commits the current changes, performs a code review, applies fixes if needed, then pushes to remote and creates a pull request. + +## Optional Arguments +- `in branch ` - Specifies the target branch to use for the commit, push, and PR + +## Workflow + +### 0. Determine Branch Name (if not provided) +- If user mentions a Linear task ID (e.g., IOS-5292), fetch the issue using `mcp__linear__list_issues` +- Extract the `gitBranchName` field from the Linear issue response +- Use this exact branch name for checkout/creation + +### 1. Commit Changes +- Stage and commit all changes with a descriptive message +- Follow CLAUDE.md commit message guidelines + +### 2. Code Review +- Run automated code review using `/codeReview` workflow +- Apply CODE_REVIEW_GUIDE.md standards +- Check for bugs, best practices violations, performance issues, security concerns + +### 3. Review Findings and Auto-Proceed +- Present review results to developer +- If issues found, **STOP and discuss** with developer: + - Should we fix the issues now? + - Are the findings valid or false positives? + - Should we proceed anyway? +- **Developer decides next steps** - never auto-amend commits +- **If review is approved (✅)**: Automatically proceed to push and PR without asking + +### 4. Push and PR (auto-proceed when approved) +- Push to remote with tracking +- Create pull request with summary +- No confirmation needed when code review is approved + +## Branch Handling +When a branch name is provided: +1. **Branch doesn't exist locally or remotely**: Creates a new branch with the specified name +2. **Branch exists locally**: Switches to that branch +3. **Branch exists only remotely**: Checks out the remote branch locally + +## Prerequisites +When working with Linear tasks, Claude should fetch the branch name before running `/cpp`: +1. User mentions task ID (e.g., "Fix IOS-2532") +2. Claude calls `mcp__linear__list_issues(query: "IOS-2532", limit: 1)` +3. Claude extracts `gitBranchName` field (e.g., "ios-2532-fix-comment-version-for-hotfix") +4. Claude switches to that branch +5. User runs `/cpp` on the correct branch + +## Examples +```bash +# Commit, review, push, and PR on current branch +/cpp + +# Commit, review, push, and PR on specific branch (creates if doesn't exist) +/cpp in branch ios-5364-add-claude-to-gh-actions +``` diff --git a/.claude/commands/designReview.md b/.claude/commands/designReview.md new file mode 100644 index 0000000000..a590140651 --- /dev/null +++ b/.claude/commands/designReview.md @@ -0,0 +1,616 @@ +USE EXTENDED THINKING + +# Design Review Command + +## Purpose +This command performs a two-way validation between SwiftUI implementation and Figma designs: +1. **Implementation → Design**: Verify code matches design specs (colors, fonts, spacing, components) +2. **Design → Implementation**: Validate design provides complete specifications for implementation + +This helps developers ensure accuracy AND helps designers improve their handoff quality. + +## Required Inputs +When running `/designReview`, provide: +1. **Linear issue ID or URL** - To fetch design context and Figma references +2. **SwiftUI view file paths** - Files to review (e.g., `Anytype/Sources/PresentationLayer/.../*.swift`) +3. **[Optional] Screenshot paths** - Rendered design screenshots for visual comparison + +Example usage: +``` +/designReview +Linear: IOS-5123 +Files: Anytype/Sources/PresentationLayer/Spaces/SpaceHub/*.swift +Screenshots: /Users/.../Desktop/space_hub_design.png +``` + +## What Gets Validated + +### Implementation Checks (Code → Design) +Verify the following elements match the Figma design: + +#### Colors +- Text colors match design tokens +- Background colors match design tokens +- Border colors match design tokens +- Gradient definitions (if any) +- Color usage in all states (normal, hover, pressed, disabled) + +#### Typography +- Font family (SF Pro, custom fonts) +- Font size (in points) +- Font weight (ultraLight, thin, light, regular, medium, semibold, bold, heavy, black) +- Line height / line spacing +- Letter spacing (if specified) +- Text alignment + +#### Spacing +- Margins (leading, trailing, top, bottom) +- Padding (internal spacing within components) +- Gaps between elements (VStack/HStack spacing) +- Component sizes (height, width) +- Values should be in points (pt) + +#### Components & Styles +- Button styles: primary, secondary, tertiary, warning, etc. +- Input field styles +- Card styles +- List item styles +- Component variants match design system + +#### Icons & Images +- SF Symbol names match Figma asset names +- Icon sizes match design specs +- Icon colors match design tokens +- Custom image assets named correctly + +#### Layout & Hierarchy +- Component arrangement matches design +- Z-index / layer ordering +- Alignment (leading, center, trailing) +- Fixed vs flexible sizing + +#### States & Interactions +- Hover states (if applicable) +- Pressed/active states +- Disabled states +- Loading states +- Error states +- Empty states +- Animations/transitions (if specified) + +### Design Completeness Checks (Design → Code) +Identify missing or unclear specifications in the design: + +#### Missing Color Specifications +- Colors not defined in design tokens +- Inconsistent color usage +- Colors shown visually but no token name provided + +#### Missing Typography Specifications +- Font weight not specified (just says "medium" without numeric value) +- Line height not provided +- Unclear font hierarchy + +#### Missing Spacing Specifications +- Spacing shown visually but no numeric values +- Inconsistent spacing patterns +- No specification for responsive behavior + +#### Missing Component Specifications +- Button states not designed (hover, pressed, disabled) +- Input field states incomplete +- No error state designs +- No empty state designs +- No loading state designs + +#### Missing Icon/Asset Information +- SF Symbol names not provided (just icon screenshots) +- Icon sizes unclear +- Custom asset naming not specified + +#### Missing Interaction Specifications +- Animation timing/easing not specified +- Transition behavior unclear +- No specification for edge cases + +## Review Workflow + +### Step 0: Load Design System Documentation +**FIRST STEP: Load project design documentation before starting the review** + +1. Reference the **Quick Reference** section in `CLAUDE.md` which lists all design system documentation paths +2. Read all design documentation files listed there (Typography Mapping, Design System Mapping, etc.) +3. Use this documentation throughout the review as the source of truth for: + - Figma text style names → Swift typography constants + - Figma color names → Swift color tokens + - Icon naming conventions + - Spacing calculation formulas + - Component style guidelines + +**Why this matters:** The project maintains comprehensive mappings between Figma design system and Swift code. Using these documented mappings ensures accurate validation and provides educational references in the report. + +**Future-proof:** When new documentation is added to CLAUDE.md Quick Reference, this command automatically uses it without needing updates. + +### Step 1: Fetch Linear Context +- Use `mcp__linear__get_issue` to fetch issue details +- Extract Figma URLs from issue description or attachments +- Capture acceptance criteria and design requirements +- Note any design-specific comments + +### Step 2: Read Implementation Files +- Use `Read` tool to load SwiftUI files +- Parse and extract: + - Color usage (`.anytypeColor`, design system colors) + - Font usage (`.uxTitle`, `.uxBody`, custom fonts) + - Spacing values (padding, spacing, frame sizes) + - Component styles (ButtonStyle, ViewModifier) + - SF Symbol names + - Layout structure (VStack, HStack, ZStack) +- Identify design system pattern usage +- **Cross-reference with design documentation** loaded in Step 0 to understand what each constant means + +### Step 3: Fetch Figma Design Context +- Use `mcp__figma__get_design_context` to fetch design structure +- Use `mcp__figma__get_screenshot` to get visual reference +- Use `mcp__figma__get_code` (if available) for design specs +- Extract: + - Color tokens and values + - Typography specs + - Spacing measurements + - Component definitions + - Asset names + +### Step 4: Side-by-Side Comparison +Compare implementation against design systematically: +- Match each SwiftUI element to corresponding Figma element +- **Use design documentation from Step 0** to validate mappings (e.g., "Content/Body/Semibold" in Figma should map to `.bodySemibold` in Swift) +- Flag mismatches (wrong color, incorrect font, spacing off) +- Flag assumptions made in code (where design was unclear) +- Flag missing specifications in design +- Calculate match score based on critical elements +- **Reference specific documentation** when identifying issues (e.g., "per TYPOGRAPHY_MAPPING.md") + +### Step 5: Generate Structured Report & Save to File +**CRITICAL: Save the complete report to a file FIRST before presenting to user** + +Create comprehensive markdown report with: +- Executive summary with match score +- Implementation issues (for developers to fix) +- Design gaps (for designers to address) +- Action items for both teams +- Specific file paths and line numbers + +**Save to:** `design_review_[feature_name].md` + +### Step 6: Present Report in Stages (Interactive Workflow) +**DO NOT dump the entire report at once.** Present sections incrementally: + +**Stage 1: Overview** +- Show Summary + Quick Assessment +- Let user understand the scope +- Ask: "Ready to review implementation mismatches?" + +**Stage 2: Critical Implementation Fixes** +- Show only HIGH priority mismatches from "Action Items for Developers" +- User fixes these issues +- Verify fixes before moving on +- Ask: "Critical issues fixed? Ready for medium/low priority items?" + +**Stage 3: Other Implementation Fixes** +- Show MEDIUM and LOW priority mismatches +- User fixes these issues +- Verify fixes before moving on +- Ask: "Implementation fixes complete? Ready to review design gaps?" + +**Stage 4: Design Gaps Documentation** +- Show "Design Gaps" and "Action Items for Designers" +- Discuss what feedback to give designers +- Ask: "Design feedback documented? Ready for workflow improvements?" + +**Stage 5: Workflow Improvements** +- Show "Workflow & Process Improvements" section +- Discuss how to improve the design review process +- Capture suggestions for command improvements + +**Between each stage:** Pause and wait for user confirmation before proceeding. + +### Step 7: Workflow Improvement Reflection +After completing the staged review, reflect on: +- What made this review difficult? +- What information was hard to find? +- What's missing from the design handoff? +- What tools/process could improve efficiency? +- How can we make this command better? + +## Output Report Format + +**NOTE:** This comprehensive format is for the file that gets saved (`design_review_[feature_name].md`). +DO NOT present this entire report to the user at once. Use the Staged Workflow (Step 6) to present sections incrementally. + +Generate a markdown report with the following structure: + +```markdown +# Design Review: [Feature Name] ([LINEAR_ID]) + +## Summary +- **Match Score**: [X/10] ([Explanation of scoring]) +- **Critical Issues**: [Count] issues blocking accurate implementation +- **Design Gaps**: [Count] missing specifications +- **Reviewed Files**: [Number] files + - [File path 1] + - [File path 2] +- **Figma References**: + - [Figma URL 1] + - [Figma URL 2] +- **Review Date**: [Date] + +## Quick Assessment +**Overall**: [Brief 1-2 sentence assessment] +**Priority Actions**: +1. [Most critical issue to address] +2. [Second most critical] + +--- + +## Implementation vs Design Analysis + +### ✅ Correct Implementations +Elements that correctly match the design: +- **[Element name]**: Correctly implements [spec detail] + - Location: `[file path]:[line number]` + - Value: [actual implementation] + +### ❌ Implementation Mismatches +Elements that don't match the design: +- **[Element name]**: Mismatch found + - **Found**: [actual value in code] + - **Expected**: [value from design] + - **Location**: `[file path]:[line number]` + - **Reference**: According to [TYPOGRAPHY_MAPPING.md or DESIGN_SYSTEM_MAPPING.md], "[Figma style]" maps to `[correct Swift constant]` + - **Impact**: [user-visible impact] + - **Fix**: [specific correction needed] + +### âš ī¸ Design Gaps (Unclear/Missing Specifications) +Elements where design doesn't provide enough information: +- **[Element name]**: Missing specification + - **What's missing**: [specific detail needed] + - **Current implementation**: [what we did as best guess] + - **Question for designer**: [what we need clarified] + - **Location**: `[file path]:[line number]` + +--- + +## Detailed Element Analysis + +### Colors +#### Implementation +- Primary text: `[token name]` ([hex value]) +- Background: `[token name]` ([hex value]) +- Accent: `[token name]` ([hex value]) +- [Other colors...] + +#### Design +- Primary text: `[design token]` ([hex value]) +- Background: `[design token]` ([hex value]) +- Accent: `[design token]` ([hex value]) +- [Other colors...] + +#### Issues +- [ ] [Color issue 1] +- [ ] [Color issue 2] + +### Typography +#### Implementation +- Title: `[style name]` (SF Pro [weight] [size]pt) +- Body: `[style name]` (SF Pro [weight] [size]pt) +- Caption: `[style name]` (SF Pro [weight] [size]pt) +- [Other typography...] + +#### Design +- Title: [Figma spec] +- Body: [Figma spec] +- Caption: [Figma spec] +- [Other typography...] + +#### Issues +- [ ] [Typography issue 1] +- [ ] [Typography issue 2] + +### Spacing +#### Implementation +- Top margin: [value]pt +- Side padding: [value]pt +- Element gaps: [value]pt +- [Other spacing...] + +#### Design +- Top margin: [value]pt +- Side padding: [value]pt +- Element gaps: [value]pt +- [Other spacing...] + +#### Issues +- [ ] [Spacing issue 1] +- [ ] [Spacing issue 2] + +### Components +#### Buttons +- **Implementation**: [button styles used] +- **Design**: [button styles specified] +- **Issues**: [list any mismatches] + +#### Icons & Images +- **Implementation**: [SF Symbols/assets used] +- **Design**: [icons specified in Figma] +- **Issues**: [naming mismatches, size issues, etc.] + +#### Other Components +- [Component type]: [findings] + +### States & Edge Cases +#### Implemented States +- Normal: ✅/❌ +- Hover: ✅/❌ +- Pressed: ✅/❌ +- Disabled: ✅/❌ +- Loading: ✅/❌ +- Error: ✅/❌ +- Empty: ✅/❌ + +#### Design Provided States +- Normal: ✅/❌ +- Hover: ✅/❌ +- Pressed: ✅/❌ +- Disabled: ✅/❌ +- Loading: ✅/❌ +- Error: ✅/❌ +- Empty: ✅/❌ + +#### Issues +- [ ] [State/edge case issue 1] +- [ ] [State/edge case issue 2] + +--- + +## Action Items + +### For Developers (Implementation Fixes) +Priority order: +1. **[High Priority]** [Specific fix needed] + - File: `[path]:[line]` + - Change: [old value] → [new value] + - Reason: [why this matters] + +2. **[Medium Priority]** [Specific fix needed] + - File: `[path]:[line]` + - Change: [description] + +3. **[Low Priority]** [Specific fix needed] + - File: `[path]:[line]` + - Change: [description] + +### For Designers (Specification Improvements) +Priority order: +1. **[High Priority]** [Specific spec needed] + - Element: [which element] + - Missing: [what information] + - Impact: [why this blocks accurate implementation] + +2. **[Medium Priority]** [Specific spec needed] + - Element: [which element] + - Missing: [what information] + +3. **[Low Priority]** [Nice to have improvement] + - Element: [which element] + - Suggestion: [how to improve clarity] + +--- + +## Workflow & Process Improvements + +### What Made This Review Difficult? +- [Challenge 1] +- [Challenge 2] + +### What Information Was Hard to Find? +- [Issue 1] +- [Issue 2] + +### Design Handoff Recommendations +- [Recommendation 1: e.g., "Include design token names in Figma layers"] +- [Recommendation 2: e.g., "Provide SF Symbol names in icon documentation"] +- [Recommendation 3: e.g., "Design all button states in a single frame"] + +### Command Improvement Suggestions +How can we make `/designReview` better? +- [Suggestion 1] +- [Suggestion 2] +- [Suggestion 3] + +--- + +## Appendix + +### Files Reviewed +``` +[Full path 1] +[Full path 2] +[Full path 3] +``` + +### Figma References +- [Figma link 1 with description] +- [Figma link 2 with description] + +### Linear References +- Issue: [LINEAR_ID] - [URL] +- Related issues: [if any] + +--- + +*This command is iterative. Please share feedback to improve the review process.* +``` + +## Implementation Guidelines + +### Staged Workflow (Critical) +**MOST IMPORTANT**: +1. Generate the complete report FIRST +2. Save it to `design_review_[feature_name].md` +3. Present only Stage 1 (Summary) to the user +4. Wait for confirmation before showing Stage 2 +5. Continue stage-by-stage, waiting for user to fix issues between stages +6. NEVER dump the entire report at once + +### Tone & Approach +- **Constructive, not critical**: Frame as collaborative improvement +- **Specific, not vague**: Always include file paths, line numbers, exact values +- **Actionable**: Every issue should have a clear fix or question +- **Balanced**: Acknowledge both good matches and mismatches +- **Blame-free**: Don't blame developer or designer - focus on process improvement + +### Technical Notes +- Use ONLY read-only tools during review (Read, Grep, Glob, Figma MCP, Linear MCP) +- No file modifications during the review process +- **Always load design documentation from CLAUDE.md Quick Reference first** (Step 0) +- Use typography/color mappings as source of truth for Figma → Swift validation +- When identifying mismatches, cite specific documentation (e.g., "According to TYPOGRAPHY_MAPPING.md, 'UX/Body/Regular' maps to `.uxBodyRegular`") +- Parse SwiftUI files carefully (look for design system usage patterns) +- Include context from Linear acceptance criteria + +### Scoring Guidance +Match score (X/10) based on: +- **10**: Perfect match, all elements correct, design fully specified +- **8-9**: Minor issues, mostly correct with small adjustments needed +- **6-7**: Several mismatches or significant design gaps +- **4-5**: Major mismatches or many missing specs +- **1-3**: Significant rework needed, design unclear or implementation way off +- **0**: Implementation doesn't resemble design at all + +### Prioritization +Focus on essential visual elements first: +1. **Critical**: Colors, fonts, spacing (users notice immediately) +2. **Important**: Components, icons, states (affects functionality) +3. **Nice-to-have**: Subtle animations, micro-interactions (polish) + +Start lean, expand over time based on what's most valuable. + +## Staged Presentation Guide + +When presenting the review in stages, keep each section concise and actionable: + +### Stage 1: Overview (Present First) +```markdown +# Design Review: [Feature Name] ([LINEAR_ID]) +Saved to: design_review_[feature_name].md + +## Summary +- Match Score: [X/10] +- Critical Issues: [Count] +- Design Gaps: [Count] + +## Quick Assessment +[1-2 sentence overview] + +Priority Actions: +1. [Most critical] +2. [Second most critical] + +--- +Ready to review critical implementation issues? +``` + +### Stage 2: Critical Fixes (Present After User Confirms) +```markdown +## Critical Implementation Issues (High Priority) + +Fix these first: + +1. [Issue name] + - File: [path:line] + - Found: [actual] + - Expected: [design spec] (per [doc name]) + - Fix: [specific action] + +2. [Issue name] + - File: [path:line] + - Found: [actual] + - Expected: [design spec] (per [doc name]) + - Fix: [specific action] + +--- +Once fixed, let me know and we'll move to medium/low priority items. +``` + +### Stage 3: Other Fixes (Present After Critical Fixed) +```markdown +## Other Implementation Issues (Medium/Low Priority) + +When you're ready, address these: + +[List medium and low priority items in same format] + +--- +Implementation fixes complete? Ready to document design gaps? +``` + +### Stage 4: Design Gaps (Present After Implementation Fixed) +```markdown +## Design Gaps to Report + +Questions for designers: + +1. [Element]: [What's missing] + - Current implementation: [what we did] + - Need: [specific spec needed] + +2. [Element]: [What's missing] + - Current implementation: [what we did] + - Need: [specific spec needed] + +Summary for designer feedback: +[Bullet list of all missing specs] + +--- +Design feedback ready? Let's discuss workflow improvements. +``` + +### Stage 5: Workflow (Present Last) +```markdown +## Workflow Improvements + +What made this review difficult: +- [Challenge 1] +- [Challenge 2] + +Design handoff recommendations: +- [Recommendation 1] +- [Recommendation 2] + +Command improvements: +- [Suggestion 1] +- [Suggestion 2] + +--- +Review complete! Full report saved in design_review_[feature_name].md +``` + +### Key Principles for Staged Presentation +- **Concise**: Show only what's needed for current stage +- **Actionable**: Each stage has clear next steps +- **Interactive**: Always end with a question/prompt +- **Progressive**: Don't move forward until current stage is complete +- **Reference**: Always mention the full report file for details + +## Iterative Improvement + +This command will evolve based on usage. After each review: +1. Note what was difficult or time-consuming +2. Identify repetitive checks that could be automated +3. Suggest additional validation criteria if needed +4. Propose better report formatting if current format isn't helpful +5. Share any discoveries about effective design review practices + +--- + +**Remember**: The goal is to make both implementation AND design better. This is a two-way conversation, not a one-way audit. diff --git a/.claude/commands/impact_linear.md b/.claude/commands/impact_linear.md index 5d45e48070..4247e540a8 100644 --- a/.claude/commands/impact_linear.md +++ b/.claude/commands/impact_linear.md @@ -5,6 +5,8 @@ USE EXTENDED THINKING ## Purpose This document guides the process of gathering comprehensive context from Linear for iOS release impact analysis and changelog generation, using a pre-configured Linear view to simplify project discovery. +**CRITICAL: Use ONLY Linear MCP tools (`mcp__linear__*`). DO NOT use git, bash, or GitHub CLI commands. All information comes from Linear API.** + ## Process ### Step 1: Get Release Information @@ -85,15 +87,17 @@ For each project/epic, find and analyze ALL sub-tasks: 2. **Issue IDs** (format like `IOS-4913`, `IOS-5149`): - Human-readable task/story identifiers - - Found in git commit messages - - Found in sub-tasks of projects + - Found in Linear sub-tasks of projects + - Found in Linear issue attachments (PR references) - **USE THESE in changelogs and impact reports** -### How to Extract Issue IDs +### How to Extract Issue IDs (Using ONLY Linear MCP Tools) +**CRITICAL: DO NOT use git commands. All data comes from Linear MCP tools.** + For each project in the view: -1. **Check sub-tasks** - Each sub-task has an issue ID (IOS-XXXX) -2. **Look at project description** - Often lists related issue IDs -3. **Review linked PRs** - GitHub PRs reference issue IDs +1. **Check sub-tasks** - Use `mcp__linear__list_issues` with project filter to find all issues. Each sub-task has an issue ID (IOS-XXXX) +2. **Look at project description** - Project descriptions from `mcp__linear__get_project` often list related issue IDs +3. **Review attachments field** - Linear issues include PR attachments with GitHub URLs 4. **Note implementation issues** - Main work is done in issue tasks, not project containers ### Issue ID Mapping Example diff --git a/.claude/commands/impact_report.md b/.claude/commands/impact_report.md index c9b47b090b..77c3a3ad8b 100644 --- a/.claude/commands/impact_report.md +++ b/.claude/commands/impact_report.md @@ -284,34 +284,99 @@ When creating the changelog from Linear and Git data: - API details - Performance metrics (unless dramatic and user-facing) -## Output 3: Team Celebration Slack Message +## Output 3: Team Message -Generate a concise, morale-boosting message for team communication (Slack, etc.) +Generate a concise, realistic message for team communication (Slack, etc.) **Requirements:** -- Keep under 15 lines total -- Use emojis for visual appeal -- No markdown (plain text for Slack compatibility) -- Focus on wow-factor numbers and achievements -- Celebratory tone +- Keep under 12 lines total (medium Slack message size) +- No emojis or excessive hype +- Plain text, professional tone +- Balance user-facing and technical work +- Humble and honest about the release scope **Template Structure:** ``` -Insane Numbers of Release [NUMBER] :exploding_head: -[X] files changed - We basically rewrote half the iOS app -[X] commits merged - That's more than 1 commit every day for a YEAR -[Key achievement 1] from ZERO to HERO in one release -[Key achievement 2] - [Impressive user-facing description] +Release [NUMBER] - [Descriptive Theme] -*P.S. - [X] Linear projects delivered simultaneously. We're basically wizards now.* +What users see: [2-3 sentence summary of user-visible features] + +What we actually did: [2-3 sentence summary of technical work - refactoring, cleanup, infrastructure] + +[Key stats]: [X] files, [X] commits, net [+/-X] lines. + +Linear said [X] projects. Git says [X+] initiatives. The gap is [explanation of additional work]. + +[Honest assessment]. [Simple close]. +``` + +**Content Guidelines:** +- Lead with honest characterization (e.g., "The Cleanup Release", "The Stability Release") +- **What users see** vs **What we actually did** contrast +- Include raw numbers without hyperbole +- Acknowledge gap between planned scope and actual work +- End with realistic assessment (not sexy but necessary, codebase healthier, etc.) +- Simple close: "Onward." or "Shipping it." - no forced enthusiasm +- Avoid: "basically rewrote", "wizards", "HERO", excessive emojis, marketing speak + +## Output 4: TestFlight Release Notes + +Generate concise release notes specifically for TestFlight testers. + +**Requirements:** +- Plain text, no markdown formatting +- Very concise - bullet points only +- Focus on what testers need to know +- Critical information first (breaking changes, compatibility) +- No emojis, no Linear IDs +- Keep under 15-20 lines total + +**Template Structure:** +``` +!!! [CRITICAL ALERTS IF ANY - Breaking changes, iOS version drops, etc.] !!! + +- [Feature 1 - one line] +- [Feature 2 - one line] +- [Feature 3 - one line] +- [Feature 4 - one line] +- [Feature 5 - one line] + +Misc: +- [Bug fix 1 - one line] +- [Bug fix 2 - one line] +- [Bug fix 3 - one line] + +Questions? Reach out in the community or support channels. ``` **Content Guidelines:** -- Lead with biggest numbers (files changed, commits, etc.) -- Include 2-3 most impressive achievements -- Use transformation language ("ZERO to HERO", "basically rewrote") -- End with team pride line about coordination/wizardry -- Keep technical jargon minimal +- **Critical alerts at top**: iOS version drops, breaking changes, data migrations + - Format: `!!! [Alert text] !!!` + - Example: `!!! Since this release we dropping Support of iOS 16 and now only support iOS 17.0 and later !!!` +- **Features section**: + - 5-7 key features maximum + - One line each, no descriptions + - Lead with feature name, add brief context if needed + - Example: `New Persistent Invite Button: The "Add members" button now stays visible in your chats, even after you've sent messages.` +- **Misc section**: + - Important bug fixes only (3-5 maximum) + - One line each + - Format: `[Area]: [What was fixed]` + - Example: `Sync Stability: Fixed rare issue where data streams could stop early` +- **Exclude**: + - Minor improvements + - Internal refactoring (unless it affects testers) + - Technical details + - Developer-only changes + - Code statistics +- **Standard closing**: Always end with "Questions? Reach out in the community or support channels." + +**What to Prioritize for Testers:** +- New visible features they should test +- Bug fixes they might have reported +- Compatibility changes that affect them +- Anything that changes existing behavior +- Known issues to watch for ## Usage Instructions 1. Load both context files from Parts 1 & 2 @@ -319,11 +384,13 @@ Insane Numbers of Release [NUMBER] :exploding_head: 3. Calculate impact scores for each change 4. Generate comprehensive testing recommendations 5. Create clean changelog focused on user value (not technical details) -6. Create team celebration message -7. Save outputs: +6. Create team message +7. Create TestFlight release notes +8. Save outputs: - `impact_analysis_release_[NUMBER].md` - `clean_changelog_release_[NUMBER].md` - - `team_celebration_release_[NUMBER].txt` + - `team_message_release_[NUMBER].txt` + - `testflight_notes_release_[NUMBER].txt` ## Tips for Creating Clean Changelog - Focus on WHAT users can do, not HOW it was built diff --git a/.claude/hooks/README.md b/.claude/hooks/README.md new file mode 100644 index 0000000000..fe262bbdec --- /dev/null +++ b/.claude/hooks/README.md @@ -0,0 +1,548 @@ +# Claude Code Hooks System + +Automated hooks for the Anytype iOS project that enhance Claude Code's capabilities with skill auto-activation, tool tracking, and code formatting. + +## Overview + +Hooks are shell scripts that run at specific points during Claude Code execution: +- **UserPromptSubmit**: Before Claude sees your message +- **PostToolUse**: After Claude uses a tool (Edit, Write, etc.) +- **Stop**: After Claude finishes responding + +These hooks enable: +- Automatic skill suggestions +- Tool usage logging +- Automatic Swift code formatting +- Real-time monitoring + +## đŸĒ Installed Hooks + +### 1. skill-activation-prompt.sh (UserPromptSubmit) + +**Purpose**: Automatically suggest relevant skills based on prompt and context + +**Event**: `UserPromptSubmit` (before Claude sees your message) + +**What it does**: +1. Analyzes your prompt for keywords (e.g., "swift", "localization", "icon") +2. Checks file paths if you're editing files +3. Matches against patterns in `skill-rules.json` +4. Injects skill suggestions into Claude's context + +**Example Output**: +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +đŸŽ¯ SKILL ACTIVATION CHECK +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +📚 Relevant Skill: ios-dev-guidelines + Description: Swift/iOS development patterns... + +💡 Consider using these skills if relevant to this task. +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +**Logs**: `.claude/logs/skill-activations.log` + +**Configuration**: `.claude/hooks/skill-rules.json` + +--- + +### 2. post-tool-use-tracker.sh (PostToolUse) + +**Purpose**: Track all file modifications for monitoring and debugging + +**Event**: `PostToolUse` (after Edit/Write/MultiEdit/NotebookEdit) + +**What it does**: +1. Logs which files were edited with timestamps +2. Categorizes by codebase area (UI/Presentation, Services, Models, etc.) +3. Creates detailed usage log for debugging +4. Enables other hooks to know what was modified + +**Example Log Entry**: +``` +[2025-01-30 14:23:45] Edit: Anytype/Sources/PresentationLayer/ChatView.swift + └─ Area: UI/Presentation, File: Anytype/Sources/PresentationLayer/ChatView.swift +``` + +**Logs**: `.claude/logs/tool-usage.log` + +--- + +### 3. swiftformat-auto.sh (Stop) + +**Purpose**: Automatically format Swift files after Claude finishes + +**Event**: `Stop` (after Claude finishes responding) + +**What it does**: +1. Reads recently edited Swift files from tool-usage.log +2. Runs SwiftFormat on each file +3. Logs formatting results +4. Displays summary with token usage warning + +**âš ī¸ Token Usage Warning**: + +File modifications trigger `` notifications that consume context tokens. Based on research from the showcase repository: +- Large files with many changes = more tokens consumed +- Strict formatting rules = more changes = more tokens +- Each change generates a system-reminder with full diff + +**Enabled by default**: `ENABLED=true` (can be disabled in script) + +**To disable**: +```bash +# Edit the script +vim .claude/hooks/swiftformat-auto.sh + +# Change line: +ENABLED=false # Set to false +``` + +**Or rename to disable**: +```bash +mv .claude/hooks/swiftformat-auto.sh .claude/hooks/swiftformat-auto.sh.disabled +``` + +**Logs**: `.claude/logs/swiftformat.log` + +**Example Output**: +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +✨ SwiftFormat Auto-Formatter +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Automatically formatted 3 Swift file(s) + +âš ī¸ Note: File formatting consumes context tokens... +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +## 📂 Directory Structure + +``` +.claude/hooks/ +├── README.md (this file) +├── skill-rules.json # Skill activation configuration +├── skill-activation-prompt.sh # UserPromptSubmit hook +├── post-tool-use-tracker.sh # PostToolUse hook +└── swiftformat-auto.sh # Stop hook + +.claude/logs/ # Generated logs (gitignored) +├── skill-activations.log +├── tool-usage.log +└── swiftformat.log +``` + +## âš™ī¸ Configuration + +### skill-rules.json + +Defines which skills activate for which patterns: + +```json +{ + "skills": { + "ios-dev-guidelines": { + "type": "domain", + "priority": "high", + "description": "Swift/iOS development patterns...", + "promptTriggers": { + "keywords": ["swift", "viewmodel", "refactor"], + "intentPatterns": [ + "(create|add).*?(view|viewmodel|coordinator)" + ] + }, + "fileTriggers": { + "pathPatterns": ["**/*.swift"], + "contentPatterns": ["class.*ViewModel", "@Published"] + } + }, + ... + }, + "config": { + "maxSkillsPerPrompt": 2, + "logActivations": true, + "logPath": ".claude/logs/skill-activations.log" + } +} +``` + +**Key Fields**: +- `keywords`: Terms that trigger skill suggestion +- `intentPatterns`: Regex for action patterns +- `pathPatterns`: File paths that activate skill +- `contentPatterns`: Code patterns to match +- `maxSkillsPerPrompt`: Limit suggestions (default: 2) + +### Hook Configuration + +Each hook script has configuration at the top: + +**skill-activation-prompt.sh**: +```bash +# Paths +SKILL_RULES="$SCRIPT_DIR/skill-rules.json" +LOG_FILE="$LOG_DIR/skill-activations.log" +``` + +**swiftformat-auto.sh**: +```bash +# Configuration +ENABLED=true # Set to false to disable +``` + +## 🔍 Monitoring & Debugging + +### View Activation Logs + +```bash +# Skill activations +tail -f .claude/logs/skill-activations.log + +# Tool usage +tail -f .claude/logs/tool-usage.log + +# SwiftFormat results +tail -f .claude/logs/swiftformat.log +``` + +### Check Hook Execution + +```bash +# List hooks +ls -lh .claude/hooks/*.sh + +# Verify executability +ls -l .claude/hooks/*.sh | grep -E "^-rwx" +``` + +### Test Hook Manually + +```bash +# Test skill-activation-prompt +echo '{"prompt":"add a feature flag for chat"}' | .claude/hooks/skill-activation-prompt.sh + +# Should output skill suggestion +``` + +## 🚀 Hook Lifecycle + +### UserPromptSubmit Flow + +``` +User types prompt + ↓ +Claude Code calls hook + ↓ +skill-activation-prompt.sh runs + ↓ +Analyzes prompt + files + ↓ +Matches against skill-rules.json + ↓ +Outputs skill suggestions + ↓ +Claude sees prompt + suggestions +``` + +### PostToolUse Flow + +``` +Claude uses Edit/Write + ↓ +Tool completes + ↓ +post-tool-use-tracker.sh runs + ↓ +Logs file path + timestamp + ↓ +Categorizes by codebase area + ↓ +Updates tool-usage.log +``` + +### Stop Flow + +``` +Claude finishes response + ↓ +swiftformat-auto.sh runs + ↓ +Reads recently edited Swift files + ↓ +Runs SwiftFormat on each + ↓ +Logs results to swiftformat.log + ↓ +Displays summary to user +``` + +## đŸ› ī¸ Managing Hooks + +### Enabling/Disabling Hooks + +**To disable a hook temporarily**: +```bash +# Rename with .disabled extension +mv .claude/hooks/swiftformat-auto.sh .claude/hooks/swiftformat-auto.sh.disabled +``` + +**To re-enable**: +```bash +mv .claude/hooks/swiftformat-auto.sh.disabled .claude/hooks/swiftformat-auto.sh +``` + +**To disable via configuration** (swiftformat-auto.sh only): +```bash +# Edit the script +vim .claude/hooks/swiftformat-auto.sh + +# Change ENABLED=true to ENABLED=false +``` + +### Adding New Hooks + +1. **Create hook script**: +```bash +touch .claude/hooks/my-new-hook.sh +chmod +x .claude/hooks/my-new-hook.sh +``` + +2. **Add shebang and setup**: +```bash +#!/bin/bash +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_DIR="$SCRIPT_DIR/../logs" +mkdir -p "$LOG_DIR" +``` + +3. **Read event data**: +```bash +EVENT_DATA=$(cat) +# Parse JSON with jq +``` + +4. **Implement logic**: +```bash +# Your hook logic here +echo "Hook executed successfully" +``` + +5. **Test**: +```bash +echo '{"test":"data"}' | .claude/hooks/my-new-hook.sh +``` + +## âš ī¸ Important Warnings + +### Token Usage with SwiftFormat + +**From Research** (showcase repository + community feedback): + +File formatting can consume significant context tokens: +- Each file change triggers a `` +- System-reminders include full file diffs +- Can consume 160k+ tokens in 3 rounds for large files with strict formatting + +**Recommendation**: +- Monitor your context usage +- Disable swiftformat-auto.sh if context depletes too quickly +- Alternative: Run SwiftFormat manually between Claude sessions + +**How to check token usage**: +- Watch the context indicator in Claude Code +- Review system-reminders in conversation +- Check if context auto-compacts frequently + +**If problematic**: +```bash +# Disable SwiftFormat hook +mv .claude/hooks/swiftformat-auto.sh .claude/hooks/swiftformat-auto.sh.disabled +``` + +### Hook Failures + +If a hook fails: +1. Check logs for error messages +2. Test hook manually with sample input +3. Verify jq is installed (required for JSON parsing) +4. Check file permissions (should be executable) +5. Look for syntax errors in shell script + +## 📊 Log Management + +### Log Rotation + +Logs can grow large over time. Rotate them periodically: + +```bash +# Archive old logs +cd .claude/logs +tar -czf logs-$(date +%Y%m%d).tar.gz *.log +rm *.log +``` + +### Clear Logs + +```bash +# Clear all logs +rm .claude/logs/*.log + +# Or truncate without deleting +truncate -s 0 .claude/logs/*.log +``` + +### Git Ignore + +Logs are gitignored by default (`.claude/logs/.gitignore`): +``` +*.log +!.gitignore +``` + +## 🔧 Troubleshooting + +### Hook Not Running + +**Problem**: Hook doesn't seem to execute + +**Solutions**: +1. Verify hook is executable: + ```bash + chmod +x .claude/hooks/skill-activation-prompt.sh + ``` + +2. Check for syntax errors: + ```bash + bash -n .claude/hooks/skill-activation-prompt.sh + ``` + +3. Test manually: + ```bash + echo '{"prompt":"test"}' | .claude/hooks/skill-activation-prompt.sh + ``` + +### Skills Not Activating + +**Problem**: No skill suggestions appear + +**Solutions**: +1. Check activation log: + ```bash + tail .claude/logs/skill-activations.log + ``` + +2. Verify skill-rules.json is valid: + ```bash + jq . .claude/hooks/skill-rules.json + ``` + +3. Use more specific keywords in prompts + +### SwiftFormat Not Running + +**Problem**: Swift files not being formatted + +**Solutions**: +1. Verify SwiftFormat is installed: + ```bash + which swiftformat + ``` + +2. Install if missing: + ```bash + brew install swiftformat + ``` + +3. Check if hook is enabled: + ```bash + grep "ENABLED" .claude/hooks/swiftformat-auto.sh + ``` + +4. Check logs: + ```bash + tail .claude/logs/swiftformat.log + ``` + +## 📚 Related Documentation + +- **Skills System**: `.claude/skills/README.md` - What skills are available +- **Showcase Repository**: https://github.com/diet103/claude-code-infrastructure-showcase - Original inspiration +- **CLAUDE.md**: Main project documentation + +## 🎓 Best Practices + +### For Hook Usage + +1. **Monitor logs regularly** - Check for errors and unusual patterns +2. **Keep skill-rules.json updated** - Add keywords as you discover them +3. **Watch token usage** - Disable SwiftFormat if context consumption is high +4. **Test hooks after updates** - Verify they still work correctly +5. **Keep hooks simple** - Complex logic should be in skills, not hooks + +### For Hook Development + +1. **Use set -euo pipefail** - Catch errors early +2. **Log extensively** - Makes debugging easier +3. **Handle edge cases** - Check for missing files, invalid JSON, etc. +4. **Test with sample data** - Don't just test in live Claude sessions +5. **Document configuration** - Explain what each setting does + +## 📖 Hook Template + +When creating a new hook: + +```bash +#!/bin/bash + +# [Hook Name] - [Description] +# Event: [UserPromptSubmit/PostToolUse/Stop] +# Purpose: [What this hook does] + +set -euo pipefail + +# Configuration +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_DIR="$SCRIPT_DIR/../logs" +LOG_FILE="$LOG_DIR/my-hook.log" + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Read event data from stdin +EVENT_DATA=$(cat) + +# Parse event data +FIELD=$(echo "$EVENT_DATA" | jq -r '.field // empty') + +# Exit if no data +if [ -z "$FIELD" ]; then + exit 0 +fi + +# Log activity +echo "[$(date '+%Y-%m-%d %H:%M:%S')] Hook executed" >> "$LOG_FILE" + +# Your logic here +# ... + +# Output to Claude (if UserPromptSubmit hook) +# echo "Your message to Claude" + +exit 0 +``` + +## Summary + +The hooks system provides: +- ✅ **Automatic skill activation** - No manual skill loading needed +- ✅ **Tool usage tracking** - Know what files were modified +- ✅ **Code formatting** - Keep Swift files formatted (with token awareness) +- ✅ **Comprehensive logging** - Debug issues and monitor activity +- ✅ **Easy configuration** - skill-rules.json for fine-tuning + +**Usage**: Hooks run automatically - you don't need to do anything. Just monitor logs and adjust configuration as needed. \ No newline at end of file diff --git a/.claude/hooks/post-tool-use-tracker.sh b/.claude/hooks/post-tool-use-tracker.sh new file mode 100755 index 0000000000..449ce508d2 --- /dev/null +++ b/.claude/hooks/post-tool-use-tracker.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Post-Tool-Use Tracker Hook +# Logs all Edit/Write/MultiEdit operations for monitoring and debugging +# Based on: https://github.com/diet103/claude-code-infrastructure-showcase + +set -euo pipefail + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_DIR="$SCRIPT_DIR/../logs" +LOG_FILE="$LOG_DIR/tool-usage.log" + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Read event data from stdin +EVENT_DATA=$(cat) + +# Extract tool name and parameters +TOOL_NAME=$(echo "$EVENT_DATA" | jq -r '.tool // "unknown"') + +# Only track file modification tools +case "$TOOL_NAME" in + Edit|Write|MultiEdit|NotebookEdit) + ;; + *) + # Not a file modification tool, exit silently + exit 0 + ;; +esac + +# Get timestamp +TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + +# Extract file path(s) based on tool type +FILE_PATHS="" + +case "$TOOL_NAME" in + Edit|Write|NotebookEdit) + FILE_PATH=$(echo "$EVENT_DATA" | jq -r '.parameters.file_path // .parameters.notebook_path // "unknown"') + FILE_PATHS="$FILE_PATH" + ;; + MultiEdit) + # MultiEdit has an array of edits + FILE_PATHS=$(echo "$EVENT_DATA" | jq -r '.parameters.edits[]?.file_path // empty' | tr '\n' ', ' | sed 's/,$//') + ;; +esac + +# If no files found, exit +if [ -z "$FILE_PATHS" ]; then + exit 0 +fi + +# Log the tool usage +echo "[$TIMESTAMP] $TOOL_NAME: $FILE_PATHS" >> "$LOG_FILE" + +# Extract repo/directory context (helps identify which part of the project was modified) +for file in $(echo "$FILE_PATHS" | tr ',' '\n'); do + # Remove leading/trailing whitespace + file=$(echo "$file" | xargs) + + # Determine which area of the codebase + AREA="unknown" + if echo "$file" | grep -q "PresentationLayer"; then + AREA="UI/Presentation" + elif echo "$file" | grep -q "ServiceLayer"; then + AREA="Services" + elif echo "$file" | grep -q "ApplicationLayer"; then + AREA="Application" + elif echo "$file" | grep -q "Models"; then + AREA="Models" + elif echo "$file" | grep -q "\.claude/"; then + AREA="Claude Config" + elif echo "$file" | grep -q "Modules/"; then + AREA="Modules" + elif echo "$file" | grep -q "\.xcstrings"; then + AREA="Localization" + fi + + echo " └─ Area: $AREA, File: $file" >> "$LOG_FILE" +done + +exit 0 diff --git a/.claude/hooks/skill-activation-prompt.sh b/.claude/hooks/skill-activation-prompt.sh new file mode 100755 index 0000000000..91b173f9cc --- /dev/null +++ b/.claude/hooks/skill-activation-prompt.sh @@ -0,0 +1,159 @@ +#!/bin/bash + +# Skill Auto-Activation Hook (UserPromptSubmit) +# This hook analyzes user prompts and suggests relevant skills automatically +# Based on: https://github.com/diet103/claude-code-infrastructure-showcase + +set -euo pipefail + +# Get the directory where this script is located +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_RULES="$SCRIPT_DIR/skill-rules.json" +LOG_DIR="$SCRIPT_DIR/../logs" +LOG_FILE="$LOG_DIR/skill-activations.log" + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Read event data from stdin +EVENT_DATA=$(cat) + +# Extract user prompt from event data +USER_PROMPT=$(echo "$EVENT_DATA" | jq -r '.prompt // empty') + +# Exit silently if no prompt +if [ -z "$USER_PROMPT" ]; then + exit 0 +fi + +# Log timestamp +echo "[$(date '+%Y-%m-%d %H:%M:%S')] Analyzing prompt..." >> "$LOG_FILE" + +# Convert prompt to lowercase for case-insensitive matching +PROMPT_LOWER=$(echo "$USER_PROMPT" | tr '[:upper:]' '[:lower:]') + +# Array to hold matched skills +MATCHED_SKILLS=() + +# Function to check if prompt contains any keyword +contains_keyword() { + local skill_name=$1 + local keywords=$(jq -r ".skills[\"$skill_name\"].promptTriggers.keywords[]" "$SKILL_RULES") + + while IFS= read -r keyword; do + keyword_lower=$(echo "$keyword" | tr '[:upper:]' '[:lower:]') + if echo "$PROMPT_LOWER" | grep -qi "$keyword_lower"; then + return 0 # Found match + fi + done <<< "$keywords" + + return 1 # No match +} + +# Function to check if prompt matches any intent pattern +matches_intent() { + local skill_name=$1 + local patterns=$(jq -r ".skills[\"$skill_name\"].promptTriggers.intentPatterns[]" "$SKILL_RULES" 2>/dev/null) + + if [ -z "$patterns" ]; then + return 1 + fi + + while IFS= read -r pattern; do + if echo "$PROMPT_LOWER" | grep -qiE "$pattern"; then + return 0 # Found match + fi + done <<< "$patterns" + + return 1 # No match +} + +# Check each skill for matches +for skill in $(jq -r '.skills | keys[]' "$SKILL_RULES"); do + if contains_keyword "$skill" || matches_intent "$skill"; then + MATCHED_SKILLS+=("$skill") + echo " ✓ Matched: $skill" >> "$LOG_FILE" + fi +done + +# If no skills matched, check if prompt is substantial +if [ ${#MATCHED_SKILLS[@]} -eq 0 ]; then + echo " No skills matched" >> "$LOG_FILE" + + # Calculate prompt size metrics + CHAR_COUNT=${#USER_PROMPT} + LINE_COUNT=$(echo "$USER_PROMPT" | wc -l | tr -d ' ') + + # Threshold: 100+ characters OR 3+ lines + if [ $CHAR_COUNT -ge 100 ] || [ $LINE_COUNT -ge 3 ]; then + echo " Substantial prompt (${CHAR_COUNT} chars, ${LINE_COUNT} lines) - prompting user" >> "$LOG_FILE" + + # Log to missed activations file + MISSED_LOG="$LOG_DIR/skill-activations-missed.log" + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Missed activation" >> "$MISSED_LOG" + echo " Prompt: ${USER_PROMPT:0:200}..." >> "$MISSED_LOG" + echo " Size: ${CHAR_COUNT} chars, ${LINE_COUNT} lines" >> "$MISSED_LOG" + echo "" >> "$MISSED_LOG" + + # Build skill list for user + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "💡 NO SKILLS ACTIVATED" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "Your prompt seems substantial (${CHAR_COUNT} chars, ${LINE_COUNT} lines) but no skills matched." + echo "" + echo "📚 Available skills:" + echo "" + + # List all skills + for skill in $(jq -r '.skills | keys[]' "$SKILL_RULES"); do + description=$(jq -r ".skills[\"$skill\"].description" "$SKILL_RULES") + echo " â€ĸ $skill" + echo " $description" + echo "" + done + + echo "❓ Should any of these skills be activated for this task?" + echo " If yes, tell me which one and I'll extract keywords from your prompt" + echo " to improve future auto-activation." + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + fi + + exit 0 +fi + +# Get max skills per prompt from config (default: 2) +MAX_SKILLS=$(jq -r '.config.maxSkillsPerPrompt // 2' "$SKILL_RULES") + +# Limit to max skills +if [ ${#MATCHED_SKILLS[@]} -gt $MAX_SKILLS ]; then + MATCHED_SKILLS=("${MATCHED_SKILLS[@]:0:$MAX_SKILLS}") +fi + +# Build skill activation message +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "đŸŽ¯ SKILL ACTIVATION CHECK" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +for skill in "${MATCHED_SKILLS[@]}"; do + description=$(jq -r ".skills[\"$skill\"].description" "$SKILL_RULES") + echo "📚 Relevant Skill: $skill" + echo " Description: $description" + echo "" +done + +echo "💡 Consider using these skills if they're relevant to this task." +echo " You can manually load a skill by reading its SKILL.md file." +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Log successful activation +echo " Suggested skills: ${MATCHED_SKILLS[*]}" >> "$LOG_FILE" + +exit 0 diff --git a/.claude/hooks/skill-rules.json b/.claude/hooks/skill-rules.json new file mode 100644 index 0000000000..b13c21fae0 --- /dev/null +++ b/.claude/hooks/skill-rules.json @@ -0,0 +1,468 @@ +{ + "skills": { + "ios-dev-guidelines": { + "type": "domain", + "priority": "high", + "description": "Smart router to Swift/iOS development patterns (→ IOS_DEVELOPMENT_GUIDE.md). Critical rules, MVVM/Coordinator patterns, code style", + "promptTriggers": { + "keywords": [ + "swift", + "swiftui", + "viewmodel", + "coordinator", + "repository", + "refactor", + "architecture", + "mvvm", + "combine", + "async", + "await", + "@Published", + "@MainActor", + "protocol", + "extension", + "formatting", + "whitespace", + "indentation", + "code style", + "best practice" + ], + "intentPatterns": [ + "(create|add|implement|build).*?(view|viewmodel|coordinator|service|repository)", + "(refactor|restructure|reorganize).*?(code|class|struct|module)", + "(how to|best practice|correct way).*?(swift|ios|architecture|pattern)", + "(format|style|organize).*?(code|file|property)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/*.swift", + "**/PresentationLayer/**", + "**/ServiceLayer/**", + "**/ApplicationLayer/**", + "**/Models/**" + ], + "contentPatterns": [ + "class.*ViewModel", + "class.*Coordinator", + "protocol.*Repository", + "@Published", + "@MainActor", + "import SwiftUI", + "import Combine" + ] + } + }, + "localization-developer": { + "type": "domain", + "priority": "high", + "description": "Smart router to localization system (→ LOCALIZATION_GUIDE.md). 3-file .xcstrings workflow, Loc constants, format specifiers", + "promptTriggers": { + "keywords": [ + "localization", + "localiz", + "Loc.", + "xcstrings", + "translation", + "strings", + "text", + "label", + "title", + "hardcoded", + "string literal", + "user-facing text", + "crowdin", + "Auth.xcstrings", + "Workspace.xcstrings", + "UI.xcstrings", + "make generate" + ], + "intentPatterns": [ + "(add|create|update).*?(localization|string|text|label)", + "(hardcoded|hard-coded|literal).*?(string|text)", + "(remove|delete).*?(localization|string|key)", + "(search|find).*?(localization|string|key)", + "(how to|where).*?(localization|string|text)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/Loc/**/*.xcstrings", + "**/Loc/**/*.swift", + "**/Resources/**/*.xcstrings" + ], + "contentPatterns": [ + "import Loc", + "Loc\\.", + "\\.xcstrings", + "AnytypeText\\(", + "localization" + ] + } + }, + "code-generation-developer": { + "type": "domain", + "priority": "medium", + "description": "Smart router to code generation (→ CODE_GENERATION_GUIDE.md). Feature flags, SwiftGen, Sourcery, make generate workflows", + "promptTriggers": { + "keywords": [ + "make generate", + "swiftgen", + "sourcery", + "generate", + "codegen", + "code generation", + "feature flag", + "FeatureFlags", + "FeatureDescription", + "protobuf", + "generated", + "// Generated using", + "Assets.xcassets", + "imageset" + ], + "intentPatterns": [ + "(run|execute).*?(make generate|swiftgen|sourcery)", + "(create|add|enable).*?(feature flag|flag)", + "(generate|regenerate).*?(code|assets|localization|protobuf)", + "(update|modify).*?(feature flag|generated)", + "(how to|best practice).*?(generate|feature flag|codegen)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/FeatureDescription+Flags.swift", + "**/Assets.xcassets/**", + "**/.xcassets/**", + "**/swiftgen.yml", + "**/sourcery.yml", + "**/anytypeGen.yml", + "**/Generated/**" + ], + "contentPatterns": [ + "// Generated using Sourcery", + "// Generated using SwiftGen", + "FeatureFlags\\.", + "FeatureDescription\\(", + "static let.*=.*FeatureDescription" + ] + } + }, + "design-system-developer": { + "type": "domain", + "priority": "medium", + "description": "Smart router to design system (→ DESIGN_SYSTEM_MAPPING.md, TYPOGRAPHY_MAPPING.md). Icons (x18-x40), typography mapping, spacing formula", + "promptTriggers": { + "keywords": [ + "icon", + "image asset", + "x18", + "x24", + "x32", + "x40", + "typography", + "font", + "text style", + "design system", + "color", + "UI component", + "figma", + "design token", + "AnytypeText", + "DESIGN_SYSTEM_MAPPING", + "TYPOGRAPHY_MAPPING" + ], + "intentPatterns": [ + "(add|create|use).*?(icon|image|asset)", + "(update|change).*?(typography|font|text style)", + "(how to|where).*?(icon|image|asset|typography|font)", + "(design system|ui component).*?(pattern|usage|guide)", + "(export|add).*?(figma|svg)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/Assets.xcassets/**/*.imageset/**", + "**/DesignSystem/**", + "**/PresentationLayer/Common/**", + "**/DESIGN_SYSTEM_MAPPING.md", + "**/TYPOGRAPHY_MAPPING.md" + ], + "contentPatterns": [ + "Image\\(asset:", + "\\.X18\\.", + "\\.X24\\.", + "\\.X32\\.", + "\\.X40\\.", + "AnytypeText\\(", + "style:.*\\.ux" + ] + } + }, + "skills-manager": { + "type": "meta", + "priority": "medium", + "description": "Smart router to skills/hooks management (→ SKILLS_MANAGEMENT_GUIDE.md). Troubleshoot activation, add keywords, fine-tune system", + "promptTriggers": { + "keywords": [ + "activation log", + "add keyword", + "check logs", + "claude.md", + "create skill", + "develop skill", + "false negative", + "false positive", + "fine-tune", + "hook", + "hooks system", + "instances", + "knowledge", + "new skill", + "proactive", + "skill activation", + "skill developer", + "skill didn't activate", + "skill not working", + "skill-rules.json", + "skills system", + "solidify", + "suggested", + "troubleshoot skill", + "why didn't" + ], + "intentPatterns": [ + "(check|view|show).*?(activation|log|skill)", + "(add|remove).*?keyword", + "(troubleshoot|debug|fix).*?(skill|hook|activation)", + "why (didn't|did).*?(activate|trigger)", + "(how to|how do I).*?(add|modify|change).*?(skill|hook|keyword)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/.claude/hooks/**", + "**/.claude/skills/**", + "**/skill-rules.json", + "**/SKILLS_MANAGEMENT_GUIDE.md" + ], + "contentPatterns": [ + "skill-rules.json", + "promptTriggers", + "fileTriggers" + ] + } + }, + "code-review-developer": { + "type": "domain", + "priority": "high", + "description": "Smart router to code review guidelines (→ code-review-guidelines.md). Review standards, common mistakes, actionable feedback only", + "promptTriggers": { + "keywords": [ + "code review", + "review code", + "PR review", + "pull request review", + "review PR", + "approve", + "review changes", + "review diff", + "feedback", + "code feedback", + "review guidelines", + "review standards" + ], + "intentPatterns": [ + "(review|check|analyze).*?(code|pr|pull request|changes|diff)", + "(approve|reject).*?(pr|pull request)", + "(provide|give).*?(review|feedback)", + "(how to|best practice).*?review" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/.github/workflows/code-review-guidelines.md", + "**/.github/workflows/claude-code-review-prompt.md" + ], + "contentPatterns": [ + "Review using CLAUDE.md", + "Review Sections", + "gh pr comment" + ] + } + }, + "feature-toggle-developer": { + "type": "domain", + "priority": "high", + "description": "Smart router to feature toggle removal (→ feature-toggle-developer.md). Systematic toggle removal, automated cleanup detection, unused code identification", + "promptTriggers": { + "keywords": [ + "remove toggle", + "delete toggle", + "enable toggle", + "feature flag", + "feature toggle", + "remove feature flag", + "delete feature flag", + "enable feature flag", + "cleanup after toggle", + "unused code", + "orphaned code", + "defaultValue: true", + "defaultValue: false", + "FeatureFlags.", + "toggle removal" + ], + "intentPatterns": [ + "(remove|delete|eliminate).*?(toggle|feature flag|feature toggle)", + "(enable|activate|turn on).*?(toggle|feature flag|permanently)", + "(cleanup|clean up|remove unused).*?(code|component|class|file)", + "(find|identify|check for).*?(unused|orphaned|dead).*?(code|component)", + "(after|completed).*?(toggle|feature flag).*?(removal|cleanup)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/FeatureDescription+Flags.swift", + "**/FeatureFlags+Flags.swift", + "**/.claude/skills/feature-toggle-developer.md" + ], + "contentPatterns": [ + "FeatureFlags\\.", + "static let.*=.*FeatureDescription", + "defaultValue: true", + "defaultValue: false", + "if FeatureFlags\\.", + "guard.*FeatureFlags\\.", + "@State.*FeatureFlags" + ] + } + }, + "analytics-developer": { + "type": "domain", + "priority": "high", + "description": "Smart router to analytics system (→ ANALYTICS_PATTERNS.md). Event logging, route tracking, AnalyticsConstants enums", + "promptTriggers": { + "keywords": [ + "analytics", + "route tracking", + "logEvent", + "AnytypeAnalytics", + "AnalyticsConstants", + "analytics event", + "track route", + "event properties", + "AnalyticsEventsPropertiesKey", + "route enum", + "HomeWidgetRoute", + "analytics pattern", + "log screen", + "log click", + "logScreen", + "logClick", + "amplitude", + "analytics tracking", + "user analytics" + ], + "intentPatterns": [ + "(add|create|implement).*?(analytics|event|route tracking)", + "(track|log).*?(route|screen|click|user|event|action)", + "(update|modify).*?(analytics|event|route)", + "(how to|where).*?(analytics|track|log|event)", + "(define|add).*?(route enum|analytics enum)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/AnalyticsConstants.swift", + "**/AnytypeAnalytics+Events.swift", + "**/Analytics/**/*.swift", + "**/ANALYTICS_PATTERNS.md" + ], + "contentPatterns": [ + "AnytypeAnalytics\\.instance\\(\\)", + "logEvent\\(", + "AnalyticsEventsPropertiesKey\\.", + "enum.*Route.*String", + "\\.analyticsValue", + "\\.analyticsType", + "\\.analyticsId", + "logScreen", + "logClick" + ] + } + }, + "tests-developer": { + "type": "domain", + "priority": "high", + "description": "Smart router to testing patterns and practices. Writing unit tests, creating mocks, test organization", + "promptTriggers": { + "keywords": [ + "test", + "tests", + "testing", + "unit test", + "unit tests", + "write test", + "write tests", + "test coverage", + "test cases", + "test file", + "test class", + "mock", + "mocking", + "mock helper", + "mock service", + "@Test", + "@Suite", + "Swift Testing", + "XCTest", + "XCTestCase", + "XCTAssert", + "#expect", + "edge case", + "edge cases", + "boundary condition", + "TDD", + "test-driven", + "assertion", + "test refactor", + "update tests", + "fix tests" + ], + "intentPatterns": [ + "(write|create|add).*?(test|tests|unit test|mock)", + "(update|modify|fix).*?(test|tests|mock)", + "(how to|best practice).*?(test|testing|mock)", + "(test|testing).*?(edge case|boundary|nil|empty)", + "(refactor|update).*?(test|mock)" + ] + }, + "fileTriggers": { + "pathPatterns": [ + "**/AnyTypeTests/**/*.swift", + "**/Tests/**/*.swift", + "**/*Tests.swift", + "**/Mocks/**/*.swift", + "**/*Mock.swift" + ], + "contentPatterns": [ + "import Testing", + "@Test func", + "@Suite", + "import XCTest", + "XCTestCase", + "XCTAssert", + "#expect\\(", + "\\.mock\\(", + "static func mock" + ] + } + } + }, + "config": { + "maxSkillsPerPrompt": 2, + "logActivations": true, + "logPath": ".claude/logs/skill-activations.log" + } +} diff --git a/.claude/hooks/swiftformat-auto.sh b/.claude/hooks/swiftformat-auto.sh new file mode 100755 index 0000000000..84e410d3ac --- /dev/null +++ b/.claude/hooks/swiftformat-auto.sh @@ -0,0 +1,108 @@ +#!/bin/bash + +# SwiftFormat Auto-Formatter Hook (Stop Event) +# Automatically formats Swift files after Claude finishes responding +# +# âš ī¸ WARNING - CONTEXT TOKEN USAGE CONCERN âš ī¸ +# Based on research from https://github.com/diet103/claude-code-infrastructure-showcase +# and community feedback: +# +# File modifications trigger notifications that consume context tokens. +# In some cases, auto-formatting can lead to significant token usage: +# - Large files with many formatting changes = more tokens consumed +# - Strict formatting rules = more changes = more tokens +# - Each file change generates a system-reminder with full diff context +# +# RECOMMENDATION: +# - Monitor your context usage after enabling this hook +# - If you notice rapid context depletion, consider disabling this hook +# - Alternative: Run SwiftFormat manually between Claude sessions instead +# +# TO DISABLE THIS HOOK: +# 1. Rename this file to add .disabled extension: swiftformat-auto.sh.disabled +# 2. Or delete this file entirely +# +# Based on: https://github.com/diet103/claude-code-infrastructure-showcase + +set -euo pipefail + +# Configuration +ENABLED=true # Set to false to disable without deleting the file +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_DIR="$SCRIPT_DIR/../logs" +TOOL_LOG="$LOG_DIR/tool-usage.log" +FORMAT_LOG="$LOG_DIR/swiftformat.log" + +# Exit if disabled +if [ "$ENABLED" != "true" ]; then + exit 0 +fi + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Check if SwiftFormat is installed +if ! command -v swiftformat &> /dev/null; then + echo "[$(date '+%Y-%m-%d %H:%M:%S')] SwiftFormat not installed. Skipping auto-format." >> "$FORMAT_LOG" + exit 0 +fi + +# Check if tool usage log exists +if [ ! -f "$TOOL_LOG" ]; then + exit 0 +fi + +# Get timestamp for this run +TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') + +# Extract Swift files that were edited in the last minute +# (Stop hook runs after Claude finishes, so recent edits are relevant) +SWIFT_FILES=$(grep -E "\.(swift|Swift)" "$TOOL_LOG" 2>/dev/null | \ + tail -20 | \ + grep -oE '[^ ]+\.swift' | \ + sort -u || true) + +# If no Swift files, exit +if [ -z "$SWIFT_FILES" ]; then + exit 0 +fi + +# Log formatting session +echo "[$TIMESTAMP] Auto-formatting Swift files..." >> "$FORMAT_LOG" + +# Format each Swift file +FORMATTED_COUNT=0 +while IFS= read -r file; do + # Skip if file doesn't exist (might have been deleted) + if [ ! -f "$file" ]; then + continue + fi + + # Run SwiftFormat + if swiftformat "$file" --quiet 2>/dev/null; then + echo " ✓ Formatted: $file" >> "$FORMAT_LOG" + ((FORMATTED_COUNT++)) + else + echo " ✗ Failed: $file" >> "$FORMAT_LOG" + fi +done <<< "$SWIFT_FILES" + +# Log summary +if [ $FORMATTED_COUNT -gt 0 ]; then + echo " Summary: Formatted $FORMATTED_COUNT Swift file(s)" >> "$FORMAT_LOG" + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "✨ SwiftFormat Auto-Formatter" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "Automatically formatted $FORMATTED_COUNT Swift file(s)" + echo "" + echo "âš ī¸ Note: File formatting consumes context tokens via diffs." + echo " If context usage is too high, disable this hook by setting ENABLED=false" + echo " in .claude/hooks/swiftformat-auto.sh" + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" +fi + +exit 0 diff --git a/.claude/hooks/utils/add-keywords-to-skill.sh b/.claude/hooks/utils/add-keywords-to-skill.sh new file mode 100755 index 0000000000..39460329b0 --- /dev/null +++ b/.claude/hooks/utils/add-keywords-to-skill.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Auto-Learning Utility +# Adds keywords to a skill's configuration for improved auto-activation + +set -euo pipefail + +# Usage check +if [ $# -lt 2 ]; then + echo "Usage: $0 [keyword2] [keyword3] ..." + echo "" + echo "Example:" + echo " $0 localization-developer \"membership\" \"tiers\" \"settings\"" + exit 1 +fi + +SKILL_NAME=$1 +shift +NEW_KEYWORDS=("$@") + +# Get script directory +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +SKILL_RULES="$SCRIPT_DIR/../skill-rules.json" +LOG_DIR="$SCRIPT_DIR/../../logs" +LOG_FILE="$LOG_DIR/skill-learning.log" + +# Ensure log directory exists +mkdir -p "$LOG_DIR" + +# Validate skill exists +if ! jq -e ".skills[\"$SKILL_NAME\"]" "$SKILL_RULES" > /dev/null 2>&1; then + echo "❌ Error: Skill '$SKILL_NAME' not found in skill-rules.json" + echo "" + echo "Available skills:" + jq -r '.skills | keys[]' "$SKILL_RULES" | sed 's/^/ - /' + exit 1 +fi + +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "📚 AUTO-LEARNING: Adding keywords to $SKILL_NAME" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Get existing keywords +EXISTING_KEYWORDS=$(jq -r ".skills[\"$SKILL_NAME\"].promptTriggers.keywords[]" "$SKILL_RULES" 2>/dev/null || echo "") + +# Check which keywords are new +TRULY_NEW_KEYWORDS=() +for keyword in "${NEW_KEYWORDS[@]}"; do + keyword_lower=$(echo "$keyword" | tr '[:upper:]' '[:lower:]') + + IS_DUPLICATE=false + while IFS= read -r existing; do + existing_lower=$(echo "$existing" | tr '[:upper:]' '[:lower:]') + if [ "$keyword_lower" = "$existing_lower" ]; then + IS_DUPLICATE=true + echo "â­ī¸ Skipping '$keyword' (already exists)" + break + fi + done <<< "$EXISTING_KEYWORDS" + + if [ "$IS_DUPLICATE" = false ]; then + TRULY_NEW_KEYWORDS+=("$keyword") + echo "✅ Adding '$keyword'" + fi +done + +# Exit if no new keywords +if [ ${#TRULY_NEW_KEYWORDS[@]} -eq 0 ]; then + echo "" + echo "â„šī¸ No new keywords to add - all provided keywords already exist" + exit 0 +fi + +echo "" +echo "Updating skill-rules.json..." + +# Create backup +cp "$SKILL_RULES" "$SKILL_RULES.backup" + +# Build jq update command +JQ_FILTER=".skills[\"$SKILL_NAME\"].promptTriggers.keywords += [" +for i in "${!TRULY_NEW_KEYWORDS[@]}"; do + if [ $i -gt 0 ]; then + JQ_FILTER+=", " + fi + JQ_FILTER+="\"${TRULY_NEW_KEYWORDS[$i]}\"" +done +JQ_FILTER+="] | .skills[\"$SKILL_NAME\"].promptTriggers.keywords |= unique" + +# Update skill-rules.json +jq "$JQ_FILTER" "$SKILL_RULES" > "$SKILL_RULES.tmp" + +# Validate JSON +if jq empty "$SKILL_RULES.tmp" 2>/dev/null; then + mv "$SKILL_RULES.tmp" "$SKILL_RULES" + echo "✅ Updated skill-rules.json" + + # Remove backup + rm "$SKILL_RULES.backup" + + # Log the update + echo "[$(date '+%Y-%m-%d %H:%M:%S')] Added keywords to $SKILL_NAME" >> "$LOG_FILE" + for keyword in "${TRULY_NEW_KEYWORDS[@]}"; do + echo " + $keyword" >> "$LOG_FILE" + done + echo "" >> "$LOG_FILE" + + echo "" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "✨ Success! Added ${#TRULY_NEW_KEYWORDS[@]} new keyword(s)" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "" + echo "💡 The system will now auto-activate '$SKILL_NAME' for prompts" + echo " containing these keywords." + echo "" +else + echo "❌ Error: Generated invalid JSON, restoring backup" + mv "$SKILL_RULES.backup" "$SKILL_RULES" + rm -f "$SKILL_RULES.tmp" + exit 1 +fi diff --git a/.claude/hooks/utils/extract-keywords.sh b/.claude/hooks/utils/extract-keywords.sh new file mode 100755 index 0000000000..bca2a48031 --- /dev/null +++ b/.claude/hooks/utils/extract-keywords.sh @@ -0,0 +1,72 @@ +#!/bin/bash + +# Keyword Extraction Utility +# Extracts relevant technical keywords from a user prompt for skill auto-learning + +set -euo pipefail + +# Read prompt from argument or stdin +if [ $# -eq 0 ]; then + PROMPT=$(cat) +else + PROMPT="$1" +fi + +# Convert to lowercase +PROMPT_LOWER=$(echo "$PROMPT" | tr '[:upper:]' '[:lower:]') + +# Common stopwords to exclude +STOPWORDS="the a an and or but in on at to for of with by from as is was are were be been being have has had do does did will would should could may might must can this that these those i you he she it we they my your his her its our their me him them what which who when where why how all each every both few more most other some such no nor not only own same so than too very just now need want like get make go see" + +# Extract words (alphanumeric + hyphens + dots) +WORDS=$(echo "$PROMPT_LOWER" | grep -oE '[a-z0-9][a-z0-9._-]*' | sort -u) + +# Filter and score words +SCORED_WORDS="" + +for word in $WORDS; do + # Skip short words + if [ ${#word} -lt 3 ]; then + continue + fi + + # Skip if stopword + if echo " $STOPWORDS " | grep -q " $word "; then + continue + fi + + # Calculate score + score=1 + + # Boost technical terms + if echo "$word" | grep -qE '^(view|model|controller|coordinator|service|repository|manager|handler)'; then + score=$((score + 3)) + fi + + # Boost Swift/iOS terms + if echo "$word" | grep -qE '^(swift|swiftui|combine|async|await|observable|published)'; then + score=$((score + 3)) + fi + + # Boost file extensions + if echo "$word" | grep -qE '\.(swift|xcstrings|yml|md)$'; then + score=$((score + 2)) + fi + + # Boost compound technical words + if echo "$word" | grep -qE '[_.]'; then + score=$((score + 2)) + fi + + # Boost longer words + if [ ${#word} -gt 8 ]; then + score=$((score + 1)) + fi + + # Store as "score word" + SCORED_WORDS="$SCORED_WORDS +$score $word" +done + +# Sort by score (descending) and take top 5 +echo "$SCORED_WORDS" | grep -v '^$' | sort -rn | head -5 | awk '{print $2}' diff --git a/.claude/logs/.gitignore b/.claude/logs/.gitignore new file mode 100644 index 0000000000..db82191f5c --- /dev/null +++ b/.claude/logs/.gitignore @@ -0,0 +1,5 @@ +# Ignore all log files generated by hooks +*.log + +# But keep this directory in git +!.gitignore diff --git a/.claude/settings.json b/.claude/settings.json index c492e3e2fc..aaeca3ded8 100644 --- a/.claude/settings.json +++ b/.claude/settings.json @@ -2,7 +2,6 @@ "permissions": { "allow": [ "Read(*)", - "read file", "Bash(git checkout:*)", "Bash(git worktree:*)", @@ -44,7 +43,9 @@ "mcp__linear__list_issue_labels", "mcp__linear__get_team", "mcp__linear__search_documentation", - + + "SlashCommand(/codeReview)", + "Bash(gh pr list:*)", "Bash(gh pr diff:*)", "Bash(git fetch:*)", @@ -68,5 +69,38 @@ "enableAllProjectMcpServers": true, "enabledMcpjsonServers": [ "Linear" - ] + ], + "hooks": { + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "command": ".claude/hooks/skill-activation-prompt.sh" + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Edit|Write|MultiEdit|NotebookEdit", + "hooks": [ + { + "type": "command", + "command": ".claude/hooks/post-tool-use-tracker.sh" + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": ".claude/hooks/swiftformat-auto.sh" + } + ] + } + ] + } } \ No newline at end of file diff --git a/.claude/skills/README.md b/.claude/skills/README.md new file mode 100644 index 0000000000..33acacc72e --- /dev/null +++ b/.claude/skills/README.md @@ -0,0 +1,606 @@ +# Claude Code Skills System + +Smart routing system for the Anytype iOS project using **progressive disclosure** architecture. Skills act as lightweight routers that provide critical rules and point you to comprehensive documentation. + +## Overview + +This skills system uses a **3-level progressive disclosure** pattern: +- **Level 1**: CLAUDE.md - Lightweight overview + quick reference +- **Level 2**: Skills (this directory) - Smart routers with critical rules + navigation +- **Level 3**: Specialized guides - Deep technical documentation + +Skills provide **automatic activation** based on your prompts and file context, eliminating the need to manually load documentation. + +## đŸŽ¯ Available Skills + +### 1. **ios-dev-guidelines** (Smart Router) +**Purpose**: Routes to Swift/iOS development patterns, architecture, and best practices + +**Auto-activates when**: +- Working with `.swift` files +- Discussing ViewModels, Coordinators, or architecture +- Refactoring or formatting code +- Using keywords: swift, swiftui, mvvm, async, await + +**Provides**: +- Critical rules (NEVER trim whitespace, update tests/mocks, etc.) +- Quick patterns (MVVM ViewModel, Coordinator, DI) +- Project structure overview +- Common historical mistakes +- **→ Routes to**: `Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md` for comprehensive details + +**Location**: `.claude/skills/ios-dev-guidelines/SKILL.md` + +--- + +### 2. **localization-developer** (Smart Router) +**Purpose**: Routes to localization system for managing .xcstrings files and Loc constants + +**Auto-activates when**: +- Working with `.xcstrings` files +- Using Loc constants +- Discussing hardcoded strings or user-facing text +- Using keywords: localization, strings, text, Loc. + +**Provides**: +- Critical rules (NEVER duplicate keys, only edit English, etc.) +- 3-file decision tree (Auth/Workspace/UI) +- Quick workflow + key naming patterns +- Dynamic localization (format specifiers) +- **→ Routes to**: `Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md` for comprehensive details + +**Location**: `.claude/skills/localization-developer/SKILL.md` + +--- + +### 3. **code-generation-developer** (Smart Router) +**Purpose**: Routes to code generation workflows (SwiftGen, Sourcery, Feature Flags, Protobuf) + +**Auto-activates when**: +- Running or discussing `make generate` +- Adding feature flags +- Working with generated files +- Using keywords: swiftgen, sourcery, feature flags, FeatureFlags + +**Provides**: +- Critical rules (NEVER edit generated files, always run make generate) +- Feature flags quick workflow (define → generate → use) +- When to run make generate table +- Quick SwiftGen, Sourcery, Middleware overviews +- **→ Routes to**: `Modules/AnytypeCore/CODE_GENERATION_GUIDE.md` for comprehensive details + +**Location**: `.claude/skills/code-generation-developer/SKILL.md` + +--- + +### 4. **design-system-developer** (Smart Router) +**Purpose**: Routes to design system patterns (icons, typography, colors, Figma-to-code) + +**Auto-activates when**: +- Working with icons or typography +- Using keywords: icon, typography, design system, figma +- Editing files in DesignSystem/ or Assets.xcassets +- Discussing colors or UI components + +**Provides**: +- Critical rules (use design system constants, spacing formula) +- Icon quick reference (x18/x24/x32/x40) +- Typography mapping (Figma → Swift) with caption exceptions +- Critical spacing formula: `Next.Y - (Current.Y + Current.Height)` +- **→ Routes to**: `DESIGN_SYSTEM_MAPPING.md` & `TYPOGRAPHY_MAPPING.md` for comprehensive details + +**Location**: `.claude/skills/design-system-developer/SKILL.md` + +--- + +### 5. **skills-manager** (Smart Router - Meta!) +**Purpose**: Routes to skills/hooks management and troubleshooting + +**Auto-activates when**: +- Discussing skill activation or hooks +- Troubleshooting why a skill didn't activate +- Using keywords: skill activation, hook, troubleshoot, fine-tune, add keyword + +**Provides**: +- Critical rules for managing the system +- Quick diagnostic workflows +- How to add/remove keywords +- Health check commands +- Common issues and fixes +- **→ Routes to**: `.claude/SKILLS_MANAGEMENT_GUIDE.md` for comprehensive management + +**Location**: `.claude/skills/skills-manager/SKILL.md` + +**Note**: This is a meta-skill - it helps you manage the skills system itself! + +--- + +### 6. **code-review-developer** (Smart Router) +**Purpose**: Routes to code review guidelines for conducting thorough, actionable reviews + +**Auto-activates when**: +- Reviewing pull requests or code changes +- Keywords: code review, PR review, review code, pull request, approve, issues +- Discussing review comments or feedback + +**Provides**: +- Critical rules (be lean, no praise sections, no design suggestions) +- Quick review workflow (read changes → check CLAUDE.md → find issues → format review) +- Common analysis mistakes (assuming unused code, not understanding flags) +- Review sections format (bugs, best practices, performance, security) +- **→ Routes to**: `.claude/CODE_REVIEW_GUIDE.md` for complete review standards +- **→ Routes to**: `.github/workflows/pr-review-automation.md` for CI/GitHub Actions integration + +**Location**: `.claude/skills/code-review-developer/SKILL.md` + +--- + +### 7. **tests-developer** (Smart Router) +**Purpose**: Routes to testing patterns and practices for writing unit tests and creating mocks + +**Auto-activates when**: +- Writing or discussing unit tests +- Creating test mocks or mock helpers +- Working with test files (AnyTypeTests/) +- Keywords: test, testing, mock, unit test, @Test, @Suite, XCTest, edge case, TDD + +**Provides**: +- Critical rules (use Swift Testing for new tests, test edge cases, update tests when refactoring) +- Swift Testing vs XCTest patterns +- Edge case testing checklist +- Mock helper patterns (in-file extensions vs separate mocks) +- Dependency injection in tests (Factory pattern) +- Testing protobuf models +- When to make methods internal for testing +- **→ Routes to**: `IOS_DEVELOPMENT_GUIDE.md` for comprehensive testing architecture + +**Location**: `.claude/skills/tests-developer/SKILL.md` + +--- + +### 8. **feature-toggle-developer** (Smart Router) +**Purpose**: Routes to feature toggle removal workflows and unused code cleanup + +**Auto-activates when**: +- Removing or enabling feature flags +- Discussing feature toggles or cleanup +- Keywords: remove toggle, feature flag, cleanup, unused code, defaultValue, FeatureFlags. + +**Provides**: +- Critical rules for systematic toggle removal +- Automated cleanup detection +- Unused code identification patterns +- Step-by-step removal workflow +- Common mistakes to avoid + +**Location**: `.claude/skills/feature-toggle-developer/SKILL.md` + +--- + +### 9. **analytics-developer** (Smart Router) +**Purpose**: Routes to analytics event logging and route tracking patterns + +**Auto-activates when**: +- Adding analytics events or route tracking +- Working with AnytypeAnalytics +- Keywords: analytics, logEvent, route tracking, AnalyticsConstants, track route + +**Provides**: +- Critical rules for event logging +- Route tracking enum patterns +- AnalyticsConstants organization +- Event properties naming +- **→ Routes to**: `ANALYTICS_PATTERNS.md` for comprehensive patterns + +**Location**: `.claude/skills/analytics-developer/SKILL.md` + +--- + +## 📊 Progressive Disclosure Architecture + +This documentation system follows the principle of **progressive disclosure** - load only what's needed, when it's needed. + +### 3-Level Information Architecture + +``` +Level 1: CLAUDE.md +├─ Quick start + critical rules +├─ Essential commands +├─ Quick workflows with "→ See [GUIDE]" pointers +└─ Links to Level 2 (Skills) and Level 3 (Specialized Docs) + +Level 2: Skills +├─ Critical rules worth duplicating +├─ Quick reference patterns +├─ Decision trees and checklists +├─ Common mistakes +└─ "→ Routes to" pointers to Level 3 + +Level 3: Specialized Guides (Comprehensive documentation) +├─ IOS_DEVELOPMENT_GUIDE.md +├─ LOCALIZATION_GUIDE.md +├─ CODE_GENERATION_GUIDE.md +├─ SKILLS_MANAGEMENT_GUIDE.md [meta!] +├─ DESIGN_SYSTEM_MAPPING.md +└─ TYPOGRAPHY_MAPPING.md +``` + +### Why This Architecture? + +**Single Source of Truth**: Each piece of knowledge lives in exactly one place +- Critical rules duplicated in skills for visibility +- Everything else lives in Level 3 specialized docs +- Skills act as routers with clear navigation paths + +**Context Token Efficiency**: Load only what's needed +- CLAUDE.md: Always loaded, lightweight overview +- Skills: Auto-activated based on context +- Specialized docs: Referenced when deep knowledge needed + +**Maintainability**: Easy to update without duplication +- Update specialized docs once +- Skills reference docs, don't duplicate content +- Clear separation of concerns + +## 🔄 How Auto-Activation Works + +### Automatic Suggestion + +When you start a conversation, the system: + +1. **Analyzes your prompt** for keywords and patterns +2. **Checks file paths** if you're editing files +3. **Matches against skill rules** (defined in `.claude/hooks/skill-rules.json`) +4. **Suggests relevant skills** with a formatted message: + +``` +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +đŸŽ¯ SKILL ACTIVATION CHECK +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +📚 Relevant Skill: ios-dev-guidelines + Description: Swift/iOS development patterns, architecture, and best practices + +💡 Consider using these skills if they're relevant to this task. + You can manually load a skill by reading its SKILL.md file. + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +``` + +### Manual Loading + +You can also manually load a skill: + +``` +Read the file .claude/skills/ios-dev-guidelines/SKILL.md +``` + +## 📂 Directory Structure + +``` +.claude/skills/ +├── README.md (this file) +│ +├── ios-dev-guidelines/ +│ └── SKILL.md (smart router) +│ +├── localization-developer/ +│ └── SKILL.md (smart router) +│ +├── code-generation-developer/ +│ └── SKILL.md (smart router) +│ +├── design-system-developer/ +│ └── SKILL.md (smart router) +│ +├── skills-manager/ +│ └── SKILL.md (smart router - meta!) +│ +├── code-review-developer/ +│ └── SKILL.md (smart router) +│ +├── tests-developer/ +│ └── SKILL.md (smart router) +│ +├── feature-toggle-developer/ +│ └── SKILL.md (smart router) +│ +└── analytics-developer/ + └── SKILL.md (smart router) +``` + +**Note**: Resource files removed in favor of specialized documentation at Level 3. + +## âš™ī¸ Configuration + +### Skill Rules + +**Location**: `.claude/hooks/skill-rules.json` + +Defines activation patterns for each skill: +- **Keywords**: Terms that trigger skill suggestion +- **Intent Patterns**: Regex patterns for actions (e.g., "create.*feature") +- **File Triggers**: Path patterns that activate skills +- **Content Patterns**: Code patterns that match skills + +### Example Configuration + +```json +{ + "skills": { + "ios-dev-guidelines": { + "type": "domain", + "priority": "high", + "promptTriggers": { + "keywords": ["swift", "viewmodel", "refactor"], + "intentPatterns": [ + "(create|add).*?(view|viewmodel|coordinator)" + ] + }, + "fileTriggers": { + "pathPatterns": ["**/*.swift"], + "contentPatterns": ["class.*ViewModel", "@Published"] + } + } + } +} +``` + +## đŸĒ Hooks Integration + +The skills system uses hooks for auto-activation: + +### UserPromptSubmit Hook + +**File**: `.claude/hooks/skill-activation-prompt.sh` + +- Runs before Claude sees your message +- Analyzes prompt and file context +- Injects skill suggestions into conversation +- Logs activations to `.claude/logs/skill-activations.log` + +### Activation Flow + +``` +User Prompt → Hook Analyzes → Matches Skills → Suggests to Claude +``` + +## 🎨 Best Practices + +### For Users + +1. **Trust the suggestions** - If a skill is suggested, it's likely relevant +2. **Don't manually load skills repeatedly** - Auto-activation handles it +3. **Use specific keywords** - Helps trigger the right skills +4. **Check activation logs** - See which skills were suggested + +### For Skill Authors (Smart Router Pattern) + +1. **Keep SKILL.md** - Skills are routers, not comprehensive guides +2. **Add clear "Critical Rules" section** - Worth duplicating for visibility +3. **Provide quick reference only** - Tables, examples, common patterns +4. **Point to Level 3 docs** - Use "**→ Routes to**: path/to/GUIDE.md" pattern +5. **No resource files** - All comprehensive content lives in Level 3 specialized docs +6. **Update skill-rules.json** - Add relevant keywords and patterns + +## 📊 Monitoring + +### Activation Logs + +**Location**: `.claude/logs/skill-activations.log` + +Shows which skills were suggested and when: + +``` +[2025-01-30 14:23:45] Analyzing prompt... + ✓ Matched: ios-dev-guidelines + Suggested skills: ios-dev-guidelines +``` + +### Tool Usage Logs + +**Location**: `.claude/logs/tool-usage.log` + +Tracks file modifications: + +``` +[2025-01-30 14:24:12] Edit: Anytype/Sources/PresentationLayer/ChatView.swift + └─ Area: UI/Presentation, File: ... +``` + +## 🚀 Usage Examples + +### Example 1: Adding a Feature Flag + +**Your Prompt**: "Add a feature flag for the new chat interface" + +**Auto-Activated**: `code-generation-developer` + +**Why**: Keyword "feature flag" matches code-generation-developer rules + +**What You Get**: Guidance on: +- Where to add FeatureDescription +- How to run `make generate` +- How to use FeatureFlags in code + +### Example 2: Implementing Figma Design + +**Your Prompt**: "Implement the empty state design with icons and typography" + +**Auto-Activated**: `design-system-developer` + +**Why**: Keywords "icons", "typography" match design-system-developer + +**What You Get**: Guidance on: +- Icon size selection +- Typography mapping +- Spacing extraction from Figma +- Color constants usage + +### Example 3: Refactoring ViewModel + +**Your Prompt**: "Refactor ChatViewModel to use async/await" + +**Auto-Activated**: `ios-dev-guidelines` + +**Why**: Keywords "ViewModel", "async/await", "refactor" match ios-dev-guidelines + +**What You Get**: Guidance on: +- ViewModel patterns +- Async/await best practices +- Property organization +- Code formatting rules + +## 🔧 Troubleshooting + +### Skills Not Activating + +**Problem**: Expected skill not suggested + +**Solutions**: +1. Check `.claude/logs/skill-activations.log` for activation attempts +2. Verify keywords in your prompt match `skill-rules.json` +3. Use more specific keywords (e.g., "localization" instead of "text") +4. Manually load skill if auto-activation fails + +### Wrong Skill Suggested + +**Problem**: Irrelevant skill suggested + +**Solutions**: +1. Ignore the suggestion (it's just a recommendation) +2. Be more specific in your prompt +3. Update `skill-rules.json` to refine matching rules + +### Multiple Skills Suggested + +**Problem**: Too many skills suggested + +**Solution**: This is normal - system limits to 2 skills max (configured in skill-rules.json) + +## 📚 Related Documentation + +- **Hooks System**: `.claude/hooks/README.md` - How hooks work +- **CLAUDE.md**: Main project documentation - Quick start and workflows +- **skill-rules.json**: Skill activation configuration + +## 🎓 Learning Path + +**New to the project?** Read skills in this order: + +1. **ios-dev-guidelines** - Understand Swift/iOS patterns +2. **localization-developer** - Learn localization workflow +3. **code-generation-developer** - Master `make generate` workflows +4. **design-system-developer** - Understand design system usage + +## 🔄 Updating Skills + +### Adding a New Skill + +1. Create directory: `.claude/skills/new-skill-name/` +2. Create `SKILL.md` with clear structure +3. Add resources to `resources/` subdirectory +4. Update `skill-rules.json` with activation patterns +5. Test activation with sample prompts +6. Update this README + +### Modifying Existing Skill + +1. Edit the SKILL.md file +2. Keep under 500 lines (move details to resources) +3. Update activation rules if keywords change +4. Test that auto-activation still works + +## 📖 Smart Router Skill Template + +When creating a new skill, follow this **smart router** pattern: + +```markdown +# Skill Name (Smart Router) + +## Purpose +Context-aware routing to [topic]. Helps you navigate [what it helps with]. + +## When Auto-Activated +- [File types or contexts] +- Keywords: [keyword1, keyword2, ...] + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. Must-follow rule 1 (worth duplicating for visibility) +2. Must-follow rule 2 +3. Must-follow rule 3 + +## 📋 Quick Reference + +[Tables, examples, common patterns - QUICK ONLY] + +### Example Pattern +```swift +// Quick code example +``` + +## đŸŽ¯ Quick Workflow + +1. Step 1 +2. Step 2 +3. Step 3 + +## âš ī¸ Common Mistakes + +### Mistake 1 +```swift +// ❌ WRONG +... + +// ✅ CORRECT +... +``` + +## 📚 Complete Documentation + +**Full Guide**: `path/to/SPECIALIZED_GUIDE.md` + +For comprehensive coverage of: +- Detailed topic 1 +- Detailed topic 2 +- Complete examples +- Troubleshooting + +## ✅ Checklist + +- [ ] Item 1 +- [ ] Item 2 + +## 🔗 Related Skills & Docs + +- **other-skill** → `path/to/OTHER_GUIDE.md` - How they relate +- **another-skill** → How they integrate + +--- + +**Navigation**: This is a smart router. For deep technical details, always refer to `SPECIALIZED_GUIDE.md`. +``` + +**Key principles**: +- ~100-200 lines total +- Critical rules duplicated for visibility +- Quick reference only (no comprehensive guides) +- Clear "→ Routes to" pointers to Level 3 docs +- No resource files - all comprehensive content in Level 3 + +## Summary + +The skills system provides: +- ✅ **Progressive disclosure architecture** - 3 levels of documentation +- ✅ **Automatic skill suggestions** based on context - Zero friction +- ✅ **6 smart router skills** - Lightweight and fast +- ✅ **Hook-based activation** - Analyzed prompts trigger relevant skills +- ✅ **Context token efficiency** - Load only what's needed +- ✅ **Single Source of Truth** - Each piece of knowledge lives in one place +- ✅ **Self-documenting** - skills-manager skill helps you manage the system +- ✅ **Logging and monitoring** for debugging + +**Start using it**: Just work normally - skills auto-activate when relevant and route you to comprehensive docs! + +**Need help managing the system?** The skills-manager skill auto-activates when you discuss troubleshooting or fine-tuning! \ No newline at end of file diff --git a/.claude/skills/analytics-developer/SKILL.md b/.claude/skills/analytics-developer/SKILL.md new file mode 100644 index 0000000000..773742ece0 --- /dev/null +++ b/.claude/skills/analytics-developer/SKILL.md @@ -0,0 +1,285 @@ +# Analytics Developer (Smart Router) + +## Purpose +Context-aware routing to the Anytype iOS analytics system. Helps you add analytics events, track user routes, and maintain consistent analytics patterns. + +## When Auto-Activated +- Working with analytics events or AnytypeAnalytics +- Adding route tracking or event properties +- Modifying `AnalyticsConstants.swift` or `AnytypeAnalytics+Events.swift` +- Keywords: analytics, route tracking, logEvent, AnytypeAnalytics, AnalyticsConstants + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **ALWAYS define route enums in AnalyticsConstants.swift** - Never hardcode route strings +2. **ALWAYS use existing property keys** - Use `AnalyticsEventsPropertiesKey.*` +3. **NEVER use string literals for routes** - Use typed enums with `.rawValue` +4. **ALWAYS use `.compactMapValues { $0 }` for optional properties** - Removes nil values +5. **ALWAYS track route context** - Know how users reached a feature + +## 📋 Quick Workflow + +### Adding New Analytics Event + +1. **Define route enum** (if needed): Add to `AnalyticsConstants.swift` +2. **Add event method**: Add to `AnytypeAnalytics+Events.swift` +3. **Use in code**: Call `AnytypeAnalytics.instance().logYourEvent(...)` + +### Adding Route Tracking to Existing Screen + +1. **Define route enum**: Add `YourFeatureRoute` to `AnalyticsConstants.swift` +2. **Update data model**: Add `route: YourFeatureRoute?` parameter +3. **Pass through hierarchy**: Coordinator → View → ViewModel +4. **Update analytics call**: Pass route to existing log method + +## đŸŽ¯ Common Patterns + +### Pattern 1: Screen Analytics (onAppear) + +```swift +// ViewModel +final class HomeWidgetsViewModel { + let route: HomeWidgetRoute? + + func onAppear() { + AnytypeAnalytics.instance().logScreenWidget(route: route) + } +} + +// Analytics method (AnytypeAnalytics+Events.swift) +func logScreenWidget(route: HomeWidgetRoute?) { + logEvent("ScreenWidget", withEventProperties: [ + AnalyticsEventsPropertiesKey.route: route?.rawValue + ].compactMapValues { $0 }) +} + +// Route enum (AnalyticsConstants.swift) +enum HomeWidgetRoute: String, Hashable, Codable { + case home = "Home" + case space = "Space" + case appLaunch = "AppLaunch" +} +``` + +### Pattern 2: Button Click Analytics + +```swift +// ViewModel +func onTapShare() { + AnytypeAnalytics.instance().logClickShare(type: .link, route: .settings) + output?.onShareSelected() +} + +// Analytics method +func logClickShare(type: ShareType, route: ShareRoute) { + logEvent("ClickShare", withEventProperties: [ + AnalyticsEventsPropertiesKey.type: type.rawValue, + AnalyticsEventsPropertiesKey.route: route.rawValue + ]) +} +``` + +### Pattern 3: Multi-Space Events + +```swift +func logCreateObject(objectType: AnalyticsObjectType, spaceId: String, route: AnalyticsEventsRouteKind) { + logEvent("CreateObject", spaceId: spaceId, withEventProperties: [ + AnalyticsEventsPropertiesKey.objectType: objectType.analyticsId, + AnalyticsEventsPropertiesKey.route: route.rawValue + ]) +} +``` + +## đŸ—‚ī¸ Analytics File Structure + +### Key Files +- **AnalyticsConstants.swift** - All route enums, property keys (400+ lines) +- **AnytypeAnalytics+Events.swift** - All event methods (1,500+ lines) +- **Converters/** - Domain type → analytics value converters + +### Route Enum Location + +**Always add to AnalyticsConstants.swift**, grouped by feature: + +```swift +// Widget-related routes +enum AnalyticsWidgetRoute: String { + case addWidget = "AddWidget" + case inner = "Inner" +} + +enum HomeWidgetRoute: String, Hashable, Codable { + case home = "Home" + case space = "Space" + case appLaunch = "AppLaunch" +} + +// Screen navigation routes +enum SettingsSpaceShareRoute: String { + case settings = "Settings" + case navigation = "Navigation" + case chat = "Chat" +} +``` + +## 📈 Route Tracking Implementation + +### Step-by-Step: Adding Route to Screen + +**Example: Adding route tracking to ScreenWidget** + +1. **Define route enum** (AnalyticsConstants.swift): +```swift +enum HomeWidgetRoute: String, Hashable, Codable { + case home = "Home" // Home button click + case space = "Space" // Space selection + case appLaunch = "AppLaunch" // App launch +} +``` + +2. **Update data model**: +```swift +struct HomeWidgetData: Hashable { + let spaceId: String + let route: HomeWidgetRoute? // Add route parameter +} +``` + +3. **Pass through view hierarchy**: +```swift +// Coordinator +HomeWidgetsView(info: info, output: model, route: data.route) + +// View +HomeWidgetsViewModel(info: info, output: output, route: route) +``` + +4. **Update analytics call**: +```swift +// ViewModel +func onAppear() { + AnytypeAnalytics.instance().logScreenWidget(route: route) +} + +// Analytics method +func logScreenWidget(route: HomeWidgetRoute?) { + logEvent("ScreenWidget", withEventProperties: [ + AnalyticsEventsPropertiesKey.route: route?.rawValue + ].compactMapValues { $0 }) +} +``` + +5. **Set route at navigation points**: +```swift +// Home button +let data = HomeWidgetData(spaceId: spaceId, route: .home) + +// Space selection +let data = HomeWidgetData(spaceId: spaceId, route: .space) + +// App launch +let data = HomeWidgetData(spaceId: spaceId, route: .appLaunch) +``` + +## 🔧 Common Property Keys + +Located in `AnalyticsEventsPropertiesKey`: + +| Key | Usage | Example | +|-----|-------|---------| +| `route` | Navigation context | `.home`, `.navigation`, `.widget` | +| `type` | Primary classification | `.image`, `.video`, `.file` | +| `objectType` | Object type ID | `type.analyticsType.analyticsId` | +| `spaceId` | Space identifier | `document.spaceId` | +| `count` | Quantity values | Number of items | +| `format` | Data format | File format, date format | + +## âš ī¸ Common Mistakes + +### ❌ Hardcoded Route Strings +```swift +// WRONG +AnytypeAnalytics.instance().logScreenWidget(route: "Home") + +// CORRECT +AnytypeAnalytics.instance().logScreenWidget(route: .home) +``` + +### ❌ Route Enum in Wrong File +```swift +// WRONG - defined in feature file +enum HomeWidgetRoute: String { + case home = "Home" +} + +// CORRECT - defined in AnalyticsConstants.swift +``` + +### ❌ Missing compactMapValues +```swift +// WRONG - will include nil values as NSNull +[AnalyticsEventsPropertiesKey.route: route?.rawValue] + +// CORRECT - removes nil values +[AnalyticsEventsPropertiesKey.route: route?.rawValue].compactMapValues { $0 } +``` + +### ❌ Using String Literals for Property Keys +```swift +// WRONG +["route": route.rawValue] + +// CORRECT +[AnalyticsEventsPropertiesKey.route: route.rawValue] +``` + +## 🔍 Finding Existing Patterns + +```bash +# Search for existing events +rg "logEvent.*EventName" Anytype/Sources/Analytics/ + +# Find route enums +rg "enum.*Route.*String" Anytype/Sources/Analytics/AnalyticsConstants.swift + +# Find property usage +rg "AnalyticsEventsPropertiesKey\." Anytype/Sources/Analytics/ + +# Find screen analytics +rg "func logScreen" Anytype/Sources/Analytics/AnytypeAnalytics+Events.swift +``` + +## 📚 Complete Documentation + +**Full Guide**: `Anytype/Sources/PresentationLayer/Common/Analytics/ANALYTICS_PATTERNS.md` + +For comprehensive coverage of: +- Analytics system architecture +- All analytics patterns (user actions, screen navigation, content creation) +- Route context tracking best practices +- Platform-specific considerations +- Testing analytics events +- Migration patterns for adding parameters +- Complete examples and code snippets + +## ✅ Workflow Checklist + +When adding analytics: + +- [ ] Route enum added to `AnalyticsConstants.swift` +- [ ] Event method added to `AnytypeAnalytics+Events.swift` +- [ ] Used existing property keys (`AnalyticsEventsPropertiesKey.*`) +- [ ] Optional properties use `.compactMapValues { $0 }` +- [ ] Route passed through view hierarchy (if tracking navigation) +- [ ] No hardcoded strings for routes or property keys +- [ ] Followed existing naming conventions (PascalCase events, camelCase properties) + +## 🔗 Related Skills & Docs + +- **ios-dev-guidelines** → `IOS_DEVELOPMENT_GUIDE.md` - MVVM/Coordinator patterns for passing analytics data +- **code-generation-developer** → Understanding the build system +- **design-system-developer** → Tracking UI interactions + +--- + +**Navigation**: This is a smart router. For deep patterns and examples, always refer to `ANALYTICS_PATTERNS.md`. diff --git a/.claude/skills/code-generation-developer/SKILL.md b/.claude/skills/code-generation-developer/SKILL.md new file mode 100644 index 0000000000..18fe9f9c31 --- /dev/null +++ b/.claude/skills/code-generation-developer/SKILL.md @@ -0,0 +1,192 @@ +# Code Generation Developer (Smart Router) + +## Purpose +Context-aware routing to code generation workflows: SwiftGen, Sourcery, Feature Flags, and Protobuf. Helps you navigate when and how to run generators. + +## When Auto-Activated +- Running or discussing `make generate` +- Adding feature flags +- Working with generated files +- Keywords: swiftgen, sourcery, feature flags, FeatureFlags, make generate + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **NEVER edit generated files** - Files marked with `// Generated using Sourcery/SwiftGen` are auto-generated +2. **ALWAYS run `make generate` after changes** - When updating templates, flags, assets, or localization +3. **Feature flags for all new features** - Wrap experimental code for safe rollouts +4. **Update source, not generated code** - Edit templates/configurations, then regenerate + +## 📋 Essential Commands + +```bash +make generate # Run all generators (SwiftGen, Sourcery, assets, localization) +make generate-middle # Regenerate middleware and protobuf (when dependencies change) +make setup-middle # Initial middleware setup +``` + +## 🚩 Feature Flags Quick Workflow + +### 1. Define Flag + +**File**: `/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift` + +```swift +extension FeatureDescription { + static let newChatInterface = FeatureDescription( + title: "New Chat Interface", + type: .feature(author: "Your Name", releaseVersion: "0.42.0"), + defaultValue: false, // Off in production + debugValue: true // On in debug builds for testing + ) +} +``` + +### 2. Generate + +```bash +make generate +``` + +This creates: `Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags.swift` + +### 3. Use in Code + +```swift +import AnytypeCore + +if FeatureFlags.newChatInterface { + NewChatView() +} else { + LegacyChatView() +} +``` + +### Flag Types + +- **`.debug`**: Debug-only (not available in production) +- **`.feature(author:releaseVersion:)`**: Production feature with metadata + +### Best Practices + +- `defaultValue: false` for unreleased features +- `debugValue: true` for easier developer testing +- Remove flags after full rollout + +## đŸŽ¯ When to Run `make generate` + +| You Did This | Run This | Why | +|--------------|----------|-----| +| Added/updated .xcstrings | `make generate` | Regenerate Loc constants | +| Added feature flag | `make generate` | Generate FeatureFlags enum | +| Added icon to Assets.xcassets | `make generate` | Generate Image asset constants | +| Modified Sourcery template | `make generate` | Regenerate code from templates | +| Updated middleware version | `make generate-middle` | Regenerate protobuf bindings | + +## 🎨 SwiftGen - Assets & Localization + +### Adding Icons + +1. Export SVG from Figma (e.g., "32/qr code" → `QRCode.svg`) +2. Add to `/Modules/Assets/.../Assets.xcassets/DesignSystem/x32/QRCode.imageset/` +3. Run `make generate` +4. Use: `Image(asset: .X32.qrCode)` + +**Icon Sizes**: x18, x24, x32, x40 (pt) + +### Localization + +SwiftGen generates Loc constants from .xcstrings files. + +See **localization-developer** skill for complete workflow. + +## 🔧 Sourcery - Template-Based Generation + +Sourcery generates Swift code from templates based on source file annotations. + +**Common uses**: +- Protocol conformance +- Mock implementations +- Dependency injection +- Enum helpers + +**Workflow**: +1. Add annotation to source file: `// sourcery: AutoEquatable` +2. Run `make generate` +3. Use generated code (don't edit generated files!) + +## 🔌 Middleware & Protobuf + +### When to Regenerate + +- Middleware version updated +- `Dependencies/Middleware/Lib.xcframework` missing binaries +- Build errors related to middleware symbols + +### Commands + +```bash +make setup-middle # Initial setup +make generate-middle # Regenerate middleware + protobuf +``` + +## âš ī¸ Common Mistakes + +### Editing Generated Files + +```swift +// In FeatureFlags.swift (GENERATED) +static let myFlag: Bool = true // ❌ DON'T DO THIS +// Your changes will be overwritten +``` + +**✅ Correct**: Edit `FeatureDescription+Flags.swift`, then `make generate` + +### Forgetting to Generate + +```swift +// Added FeatureDescription but didn't generate +if FeatureFlags.myNewFlag { // ❌ Error: unresolved identifier + ... +} +``` + +**✅ Correct**: Run `make generate` first + +### Missing Middleware Binaries + +**Symptoms**: "Lib.xcframework missing binaries" + +**Solution**: `make setup-middle` or `make generate` + +## 📚 Complete Documentation + +**Full Guide**: `Modules/AnytypeCore/CODE_GENERATION_GUIDE.md` + +For comprehensive coverage of: +- Feature Flags lifecycle (Development → Beta → Rollout → Cleanup) +- SwiftGen configuration files and workflows +- Sourcery templates and annotations +- Protobuf splitting configuration +- Complete troubleshooting guide +- Generated file locations + +## ✅ Checklist: Before Committing + +- [ ] Ran `make generate` if you added/updated: + - [ ] Feature flags + - [ ] Icons/assets + - [ ] Localization strings + - [ ] Sourcery annotations +- [ ] Did NOT manually edit files with "// Generated using" header +- [ ] Committed both source AND generated files +- [ ] Verified build succeeds + +## 🔗 Related Skills & Docs + +- **localization-developer** → `LOCALIZATION_GUIDE.md` - Localization keys generated by SwiftGen +- **ios-dev-guidelines** → `IOS_DEVELOPMENT_GUIDE.md` - Never edit generated files +- **design-system-developer** → Icons generated by SwiftGen + +--- + +**Navigation**: This is a smart router. For deep technical details, always refer to `CODE_GENERATION_GUIDE.md`. diff --git a/.claude/skills/code-review-developer/SKILL.md b/.claude/skills/code-review-developer/SKILL.md new file mode 100644 index 0000000000..1279b0a5c3 --- /dev/null +++ b/.claude/skills/code-review-developer/SKILL.md @@ -0,0 +1,279 @@ +# Code Review Developer (Smart Router) + +## Purpose +Context-aware routing to code review guidelines. Helps you conduct thorough, actionable code reviews following project standards. + +## When Auto-Activated +- Reviewing pull requests or code changes +- Keywords: code review, PR review, review code, pull request, approve, issues +- Discussing review comments or feedback + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **Be LEAN and ACTIONABLE** - Only report actual issues, no noise +2. **NO praise sections** - No "Strengths", no "no concerns" statements +3. **NO design suggestions** - You cannot see visual design (padding, margins, colors) +4. **Reference file:line** - Always include specific locations for issues +5. **If clean, just approve** - "✅ **Approved** - No issues found" (nothing else!) +6. **Check CLAUDE.md** - Review against project conventions + +## 📋 Quick Review Workflow + +### 1. Read the Changes +- Understand what the PR is trying to do +- Check file diffs thoroughly + +### 2. Check Against CLAUDE.md +- Localization: Using `Loc` constants? +- Generated files: Not editing generated code? +- Code style: Following Swift best practices? +- Tests: Updated when refactoring? + +### 3. Look for Real Issues +**ONLY include sections if issues exist:** +- **Bugs/Issues** - Logic errors, potential bugs +- **Best Practices** - Violations of CLAUDE.md guidelines +- **Performance** - Actual performance problems +- **Security** - Real security vulnerabilities + +### 4. Format Your Review + +**If clean**: +``` +✅ **Approved** - No issues found +``` + +**CRITICAL**: When approving, output ONLY the line above. NO additional explanation, NO listing what the PR does, NO praise. Just the approval line. + +**If issues found**: +``` +## Bugs/Issues + +**ChatView.swift:45** +Potential race condition when... + +--- + +âš ī¸ **Minor Issues** - Fix race condition +``` + +## âš ī¸ Common Mistakes to Avoid + +### Assuming Code is Unused After UI Removal + +**Scenario**: PR removes a menu button but leaves the `menu` parameter + +**❌ WRONG**: +``` +"The menu parameter is now unused and should be removed" +``` + +**✅ CORRECT**: +``` +Check if menu is used elsewhere: +- Long-press context menu? +- Dual UX pattern (button + long-press)? +- Multiple consumers? +``` + +**Example**: +```swift +// menu() is used in BOTH places +.toolbar { Menu { menu() } } // Visible button (removed) +.contextMenu { menu() } // Long-press (still there!) +``` + +**Before suggesting removal**: +- [ ] Searched ALL usages in the file +- [ ] Checked for dual UX patterns +- [ ] Understood purpose of each flag +- [ ] Asked about design intent if unsure + +### Not Understanding Conditional Flags + +**Scenario**: Component has `allowMenuContent` and `allowContextMenuItems` + +**❌ WRONG**: +``` +"These flags serve the same purpose, consolidate them" +``` + +**✅ CORRECT**: +``` +They control DIFFERENT UI elements: +- allowMenuContent: Visible button +- allowContextMenuItems: Long-press menu +- Can be independently enabled/disabled +``` + +## đŸŽ¯ Review Sections (Include ONLY If Issues Exist) + +### Bugs/Issues +Logic errors, potential bugs that need fixing + +**Format**: +``` +**FileName.swift:123** +Description of the bug and why it's a problem. +``` + +### Best Practices +Violations of Swift/SwiftUI conventions or CLAUDE.md guidelines (code quality only, not design) + +**Format**: +``` +**FileName.swift:45** +Using hardcoded strings instead of Loc constants. +``` + +### Performance +Actual performance problems (not theoretical) + +**Format**: +``` +**ViewModel.swift:89** +N+1 query in loop - will cause performance issues with large datasets. +``` + +### Security +Real security vulnerabilities + +**Format**: +``` +**AuthService.swift:34** +Storing credentials in UserDefaults - should use Keychain. +``` + +## 📊 Summary Format + +**End with ONE sentence with status emoji**: + +``` +✅ **Approved** - Clean implementation following guidelines +âš ī¸ **Minor Issues** - Fix hardcoded strings and race condition +🚨 **Major Issues** - Critical security vulnerability in auth flow +``` + +## 🔍 Analysis Checklist + +Before finalizing your review: +- [ ] Checked against CLAUDE.md conventions +- [ ] Verified localization (no hardcoded strings) +- [ ] Checked for generated file edits +- [ ] Looked for race conditions +- [ ] Verified tests/mocks updated if refactoring +- [ ] Searched for ALL usages before suggesting removal +- [ ] Only included sections with actual issues +- [ ] No design/UI suggestions (padding, margins, colors) +- [ ] Referenced specific file:line for each issue +- [ ] Ended with status emoji summary + +## 📚 Complete Documentation + +**Full Guide**: `.claude/CODE_REVIEW_GUIDE.md` + +For comprehensive coverage of: +- Core review rules +- Common analysis mistakes (with examples) +- Review sections and formats +- Complete checklist + +**CI/Automation**: `.github/workflows/pr-review-automation.md` + +For GitHub Actions integration: +- Context variables (REPO, PR_NUMBER, COMMIT_SHA) +- Valid runners and Xcode versions +- Review comment strategies +- How to post reviews via `gh` CLI + +## 💡 Quick Reference + +### What to Check + +**From CLAUDE.md**: +- [ ] No hardcoded strings (use `Loc` constants) +- [ ] No generated file edits (`// Generated using...`) +- [ ] Tests/mocks updated when refactoring +- [ ] Feature flags for new features +- [ ] No whitespace trimming +- [ ] Async/await over completion handlers + +**Code Quality**: +- [ ] Swift best practices (guard, @MainActor) +- [ ] Proper error handling +- [ ] No force unwraps in production code +- [ ] Memory leaks (weak/unowned where needed) + +### What NOT to Comment On + +- ❌ Design/UI spacing (padding, margins) +- ❌ Colors or visual appearance +- ❌ Praise or "Strengths" sections +- ❌ "No concerns" statements +- ❌ Theoretical performance issues +- ❌ Style preferences not in CLAUDE.md + +## 🎓 Example Reviews + +### Example 1: Clean PR +``` +✅ **Approved** - No issues found +``` + +**That's it! Absolutely nothing else. Not even in comments posted to GitHub.** + +**❌ WRONG** (too verbose): +``` +✅ **Approved** - No issues found + +The PR correctly implements per-chat notification overrides: +- Added force list properties with proper subscription keys +- effectiveNotificationMode(for:) method correctly prioritizes... +``` + +**✅ CORRECT**: +``` +✅ **Approved** - No issues found +``` + +### Example 2: Minor Issues +``` +## Best Practices + +**ChatView.swift:34** +Using hardcoded string "Send Message" instead of localization constant. +Should be: `Text(Loc.sendMessage)` + +**ChatViewModel.swift:89** +Tests not updated after renaming `sendMessage()` to `send()`. +Update `ChatViewModelTests.swift` to use new method name. + +--- + +âš ī¸ **Minor Issues** - Fix hardcoded string and update tests +``` + +### Example 3: Critical Issue +``` +## Bugs/Issues + +**AuthService.swift:45** +Storing password in UserDefaults (line 45). This is a security vulnerability. +Should use Keychain instead: `KeychainService.store(password, for: key)` + +--- + +🚨 **Major Issues** - Fix password storage security vulnerability +``` + +## 🔗 Related Skills & Docs + +- **ios-dev-guidelines** → `IOS_DEVELOPMENT_GUIDE.md` - Swift/iOS patterns to check against +- **localization-developer** → `LOCALIZATION_GUIDE.md` - Verify no hardcoded strings +- **code-generation-developer** → `CODE_GENERATION_GUIDE.md` - Verify no generated file edits + +--- + +**Navigation**: This is a smart router. For detailed review standards and common mistakes, always refer to `.claude/CODE_REVIEW_GUIDE.md`. + +**For CI/automation**: See `.github/workflows/pr-review-automation.md` for GitHub Actions integration. diff --git a/.claude/skills/design-system-developer/SKILL.md b/.claude/skills/design-system-developer/SKILL.md new file mode 100644 index 0000000000..629f038810 --- /dev/null +++ b/.claude/skills/design-system-developer/SKILL.md @@ -0,0 +1,207 @@ +# Design System Developer (Smart Router) + +## Purpose +Context-aware routing to the Anytype iOS design system: icons, typography, colors, spacing. Helps you navigate Figma-to-code translation. + +## When Auto-Activated +- Working with icons or typography +- Keywords: icon, typography, design system, figma, color, spacing +- Editing files in DesignSystem/ or Assets.xcassets +- Discussing colors or UI components + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **ALWAYS use design system constants** - Never hardcode hex colors, font sizes, or asset names +2. **ALWAYS run `make generate` after adding assets** - Icons and assets must be code-generated +3. **Icons are organized by size** - x18, x24, x32, x40 (use correct size for context) +4. **Typography follows strict mapping** - Figma style names map to specific Swift enum cases +5. **Spacing formula** - `NextElement.Y - (CurrentElement.Y + CurrentElement.Height)` + +## 📋 Quick Reference + +### Icon Usage + +```swift +// 18pt - Toolbar/nav bar icons +Image(asset: .X18.search) + +// 24pt - List row icons +Image(asset: .X24.camera) + +// 32pt - Buttons, main UI (most common) +Image(asset: .X32.qrCode) + +// 40pt - Large features +Image(asset: .X40.profile) +``` + +### Adding Icons + +1. Export SVG from Figma ("32/qr code" → `QRCode.svg`) +2. Add to `/Modules/Assets/.../Assets.xcassets/DesignSystem/x32/QRCode.imageset/` +3. Run `make generate` +4. Use: `Image(asset: .X32.qrCode)` + +### Typography Usage + +```swift +// Screen titles +AnytypeText("Settings", style: .uxTitle1Semibold) + +// Section headers +AnytypeText("Recent", style: .uxTitle2Semibold) + +// Body text +Text("Description").anytypeStyle(.bodyRegular) + +// Small labels +Text("Add Member").anytypeStyle(.caption1Medium) // Note: no "ux" prefix! +``` + +### Typography Mapping (Figma → Swift) + +**Content Styles** (remove "Content/" prefix): +- "Content/Body/Semibold" → `.bodySemibold` +- "Content/Preview Title 2/Regular" → `.previewTitle2Regular` + +**UX Styles - Title/Body/Callout** (keep "ux" prefix lowercase): +- "UX/Title 1/Semibold" → `.uxTitle1Semibold` +- "UX/Body/Regular" → `.uxBodyRegular` + +**UX Styles - Captions** (DROP "ux" prefix - EXCEPTION!): +- "UX/Caption 1/Medium" → `.caption1Medium` (no "ux") +- "UX/Caption 2/Regular" → `.caption2Regular` (no "ux") + +### Common Typography Styles + +| Use Case | Figma Style | Swift Constant | Size | +|----------|-------------|----------------|------| +| Screen titles | UX/Title 1/Semibold | `.uxTitle1Semibold` | 28pt | +| Section headers | UX/Title 2/Semibold | `.uxTitle2Semibold` | 17pt | +| Body text | Content/Body/Regular | `.bodyRegular` | 17pt | +| Small labels | UX/Caption 1/Medium | `.caption1Medium` | 13pt | + +### Color Usage + +```swift +// Backgrounds +.background(Color.Shape.transperentSecondary) +.background(Color.Background.primary) + +// Text colors +.foregroundColor(Color.Text.primary) +.foregroundColor(Color.Text.secondary) + +// Control colors +.foregroundColor(Color.Control.active) +``` + +## 📏 Spacing from Figma (CRITICAL FORMULA) + +**CRITICAL**: Spacing is the GAP between elements, not top-to-top distance. + +**Formula**: +``` +Spacing = NextElement.Y - (CurrentElement.Y + CurrentElement.Height) +``` + +**Example**: +1. First element: Y=326px, Height=24px → Bottom edge = 350px +2. Second element: Y=374px +3. **Spacing = 374 - 350 = 24px** ✅ + +**Common mistake**: +``` +❌ WRONG: 374 - 326 = 48px (includes first element's height!) +✅ CORRECT: 374 - (326 + 24) = 24px (actual gap) +``` + +**SwiftUI usage**: +```swift +Text("Title") +Spacer.fixedHeight(24) // ✅ Correct spacing +Text("Feature") +``` + +## âš ī¸ Common Mistakes + +### Typography Style Doesn't Exist + +```swift +// ❌ WRONG +Text("Button").anytypeStyle(.uxCaption1Medium) // Doesn't exist! + +// ✅ CORRECT +Text("Button").anytypeStyle(.caption1Medium) // Captions drop "ux" prefix +``` + +### Hardcoded Colors + +```swift +// ❌ WRONG +.background(Color(hex: "#FF0000")) + +// ✅ CORRECT +.background(Color.Pure.red) +``` + +### Wrong Icon Size + +```swift +// ❌ WRONG - Upscaling looks bad +Image(asset: .X18.qrCode) + .frame(width: 32, height: 32) + +// ✅ CORRECT - Use native size +Image(asset: .X32.qrCode) + .frame(width: 32, height: 32) +``` + +### Spacing Calculation + +```swift +// ❌ WRONG - Top-to-top (includes height) +Spacing = NextElement.Y - CurrentElement.Y + +// ✅ CORRECT - Actual gap +Spacing = NextElement.Y - (CurrentElement.Y + CurrentElement.Height) +``` + +## 📚 Complete Documentation + +**Full Guides**: +- **Design System**: `Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md` +- **Typography**: `Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md` + +For comprehensive coverage of: +- Complete typography mapping table +- All color categories and constants +- Icon organization and workflows +- Corner radius standards +- Dimension standards (whole numbers only) +- Design verification workflow +- Dark/light mode considerations + +**Figma References**: +- Typography: https://www.figma.com/file/vgXV7x2v20vJajc7clYJ7a/Typography-Mobile + +## ✅ Design Implementation Checklist + +- [ ] All icons use `.X*` constants, no hardcoded asset names +- [ ] All typography uses `.anytypeStyle()` or `AnytypeText` +- [ ] All colors use `Color.*` constants, no hex values +- [ ] Spacing extracted from Figma using correct formula +- [ ] All dimensions are whole numbers (or documented if rounded) +- [ ] Ran `make generate` after adding new assets +- [ ] Verified against Figma design visually +- [ ] Checked dark/light mode appearance + +## 🔗 Related Skills & Docs + +- **code-generation-developer** → `CODE_GENERATION_GUIDE.md` - Run make generate after adding icons +- **ios-dev-guidelines** → `IOS_DEVELOPMENT_GUIDE.md` - SwiftUI patterns for design system +- **localization-developer** → Combine typography with localized text + +--- + +**Navigation**: This is a smart router. For deep technical details, always refer to `DESIGN_SYSTEM_MAPPING.md` and `TYPOGRAPHY_MAPPING.md`. diff --git a/.claude/skills/feature-toggle-developer/SKILL.md b/.claude/skills/feature-toggle-developer/SKILL.md new file mode 100644 index 0000000000..91e1c2eb8b --- /dev/null +++ b/.claude/skills/feature-toggle-developer/SKILL.md @@ -0,0 +1,309 @@ +# Feature Toggle Developer + +**Status**: Active +**Auto-activates on**: Feature flag/toggle removal, cleanup after refactoring toggles +**Related Skills**: `code-generation-developer`, `ios-dev-guidelines`, `code-review-developer` + +## Purpose + +Guides the systematic removal of feature toggles (feature flags) from the codebase with automated cleanup detection. Ensures no orphaned code, unused components, or forgotten files remain after toggle removal. + +## When This Skill Activates + +- User mentions: "remove toggle", "delete feature flag", "enable feature toggle permanently" +- User edits: `FeatureDescription+Flags.swift` +- After completing toggle removal: helps identify cleanup opportunities + +## Feature Toggle Removal Workflow + +### Phase 1: Pre-Removal Analysis + +Before removing any toggle, gather complete information: + +1. **Find the toggle definition**: + ```bash + # Location: Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift + rg "static let toggleName" --type swift + ``` + +2. **Check the defaultValue** to determine which branch to keep: + - `defaultValue: true` → Keep the TRUE branch, remove FALSE branch + - `defaultValue: false` → Keep the FALSE branch, remove TRUE branch + +3. **Search for ALL usages**: + ```bash + rg "toggleName" --type swift + ``` + +4. **Identify usage patterns**: + - Direct: `if FeatureFlags.toggleName { ... }` + - Inverted: `if !FeatureFlags.toggleName { ... }` or `guard !FeatureFlags.toggleName` + - Compound: `if FeatureFlags.toggleName && otherCondition { ... }` + - Assignment: `let value = FeatureFlags.toggleName ? a : b` + - State: `@State private var toggle = FeatureFlags.toggleName` + +5. **List affected files** and present to user for review + +### Phase 2: Toggle Removal + +Systematic removal process: + +1. **Remove conditional checks and simplify**: + + **Example 1 - Simple conditional (defaultValue: true)**: + ```swift + // BEFORE + if FeatureFlags.toggleName { + // feature code + } + + // AFTER (keep true branch) + // feature code + ``` + + **Example 2 - Ternary operator (defaultValue: true)**: + ```swift + // BEFORE + VStack(spacing: FeatureFlags.toggleName ? 8 : 0) + + // AFTER + VStack(spacing: 8) + ``` + + **Example 3 - Inverted logic (defaultValue: true)**: + ```swift + // BEFORE + guard !FeatureFlags.toggleName else { return } + oldCode() + + // AFTER (flag is true, so guard fails, remove entire block) + // [entire block deleted] + ``` + + **Example 4 - State variable (defaultValue: true)**: + ```swift + // BEFORE + @State private var toggle = FeatureFlags.toggleName + if toggle { newUI() } else { oldUI() } + + // AFTER + newUI() + // Note: @State variable removed in cleanup phase + ``` + +2. **Remove feature flag definition**: + ```swift + // Delete from: Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift + static let toggleName = FeatureDescription(...) + ``` + +3. **Run code generation**: + ```bash + make generate + ``` + This updates `FeatureFlags+Flags.swift` automatically. + +4. **Verify removal**: + ```bash + rg "toggleName" --type swift # Should return no results + ``` + +### Phase 3: Automated Cleanup Detection ⭐ + +**CRITICAL**: After toggle removal, systematically check for orphaned code: + +#### 3.1 Unused State Variables + +Search for `@State` variables that were only used for the toggle: + +```bash +# Look for patterns like: @State private var someToggle = FeatureFlags.toggleName +rg "@State.*=.*FeatureFlags" --type swift +``` + +**Action**: Remove the entire `@State` variable declaration if it's no longer used. + +#### 3.2 Unused View Components + +When a toggle controlled which UI component to show, one component may now be unused: + +**Detection Pattern**: +- Toggle switched between ComponentA and ComponentB +- After removal, only one is used +- Search for the unused component's name across codebase + +**Example from vaultBackToRoots**: +```swift +// BEFORE +if !vaultBackToRootsToggle { + SpaceCardLabel(...) // This became unused +} else { + NewSpaceCardLabel(...) +} + +// AFTER +NewSpaceCardLabel(...) + +// CLEANUP: SpaceCardLabel is now unused +rg "SpaceCardLabel" --type swift # Check if used anywhere else +# If only in its own file → DELETE the file +``` + +**Action**: +1. Search for unused component name: `rg "UnusedComponentName" --type swift` +2. If only found in its definition file and comments → DELETE the file +3. Update references in comments + +#### 3.3 Unused ViewModels / Service Classes + +Toggle removal may leave entire classes unused: + +**Detection**: +```bash +# For each major component that was conditionally used: +rg "UnusedViewModel" --type swift +rg "class UnusedViewModel" --type swift +``` + +**Action**: Delete unused ViewModels, their files, and DI registrations. + +#### 3.4 Unused Imports + +After simplification, `import AnytypeCore` may only have been needed for `FeatureFlags`: + +**Detection**: +- File imports `AnytypeCore` +- Only usage was `FeatureFlags.toggleName` +- After removal, no other `AnytypeCore` usage + +**Action**: Remove unused import. + +#### 3.5 Orphaned Parameters / Properties + +Toggle-gated functionality may have parameters that are no longer needed: + +**Example**: +```swift +// BEFORE +func configure(showFeature: Bool) { + if showFeature && FeatureFlags.toggle { ... } +} + +// AFTER toggle removal +func configure(showFeature: Bool) { + if showFeature { ... } +} + +// POTENTIAL CLEANUP: Is showFeature still needed? +``` + +**Action**: Review function signatures and remove unnecessary parameters. + +#### 3.6 Test Cleanup + +Toggle removal affects tests: + +**Check**: +1. Mock objects with toggle-related properties +2. Test cases specifically for toggle behavior +3. Test setup code with toggle configurations + +**Files to check**: +```bash +rg "toggleName" AnyTypeTests/ --type swift +rg "toggleName" "Anytype/Sources/PreviewMocks/" --type swift +``` + +**Action**: Update or remove tests for deleted code paths. + +### Phase 4: Final Verification + +Before committing: + +1. **Grep verification**: + ```bash + rg "toggleName" --type swift # Should be empty + ``` + +2. **Compilation check**: + - Remind user to verify compilation in Xcode + - Claude cannot verify this due to caching + +3. **Generate updated commit message**: + ``` + IOS-XXXX Removed [toggleName] toggle + ``` + +4. **Review cleanup summary**: + - List all files modified + - List all files deleted + - Note any remaining manual checks needed + +## Cleanup Checklist Template + +Use this checklist after every toggle removal: + +```markdown +## Cleanup Verification for [toggleName] + +- [ ] Toggle definition removed from FeatureDescription+Flags.swift +- [ ] `make generate` run successfully +- [ ] All conditional usage removed +- [ ] No grep results for toggle name +- [ ] Unused @State variables removed +- [ ] Unused view components identified and deleted +- [ ] Unused ViewModels/services deleted +- [ ] Unused imports removed (especially AnytypeCore) +- [ ] Orphaned function parameters removed +- [ ] Tests updated (check AnyTypeTests/ and PreviewMocks/) +- [ ] Comments referencing old component updated +- [ ] Xcode compilation verified (by user) +``` + +## Common Patterns & Pitfalls + +### Inverted Logic + +**Watch out for** `!FeatureFlags.toggle`: + +```swift +// If defaultValue: true +if !FeatureFlags.toggle { + oldCode() // This branch NEVER runs, delete it +} +``` + +### Compound Conditions + +**Simplify** conditions properly: + +```swift +// BEFORE (defaultValue: true) +if FeatureFlags.toggle && userHasPermission { + showFeature() +} + +// AFTER +if userHasPermission { + showFeature() +} +``` + +### Guard Statements + +**Be careful** with guards: + +```swift +// BEFORE (defaultValue: true) +guard !FeatureFlags.toggle else { return } +performOldBehavior() + +// AFTER (toggle is true, guard returns, entire block is dead code) +// DELETE ENTIRE BLOCK +``` + +## Integration with Other Skills + +- **code-generation-developer**: References for `make generate` command and troubleshooting +- **ios-dev-guidelines**: Swift refactoring patterns, import management +- **code-review-developer**: Cleanup standards, ensuring no orphaned code in PRs \ No newline at end of file diff --git a/.claude/skills/ios-dev-guidelines/SKILL.md b/.claude/skills/ios-dev-guidelines/SKILL.md new file mode 100644 index 0000000000..81b7d16536 --- /dev/null +++ b/.claude/skills/ios-dev-guidelines/SKILL.md @@ -0,0 +1,127 @@ +# iOS Development Guidelines (Smart Router) + +## Purpose +Context-aware routing to iOS development patterns, code style, and architecture guidelines. This skill provides critical rules and points you to comprehensive documentation. + +## When Auto-Activated +- Working with `.swift` files +- Discussing ViewModels, Coordinators, architecture +- Refactoring or formatting code +- Keywords: swift, swiftui, mvvm, async, await, refactor + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **NEVER trim whitespace-only lines** - Preserve blank lines with spaces/tabs exactly as they appear +2. **NEVER edit generated files** - Files marked with `// Generated using Sourcery/SwiftGen` +3. **NEVER use hardcoded strings in UI** - Always use localization constants (`Loc.*`) +4. **NEVER add comments** unless explicitly requested +5. **ALWAYS update tests and mocks when refactoring** - Search for all references and update +6. **Use feature flags for new features** - Wrap experimental code for safe rollouts + +## 📋 Quick Checklist + +Before completing any task: +- [ ] Whitespace-only lines preserved (not trimmed) +- [ ] No hardcoded strings (use `Loc` constants) +- [ ] Tests and mocks updated if dependencies changed +- [ ] Generated files not edited +- [ ] Feature flags applied to new features +- [ ] No comments added (unless requested) + +## đŸŽ¯ Common Patterns + +### MVVM ViewModel +```swift +@MainActor +final class ChatViewModel: ObservableObject { + @Published var messages: [Message] = [] + @Injected(\.chatService) private var chatService + + func sendMessage(_ text: String) async { + // Business logic here + } +} +``` + +### Coordinator +```swift +@MainActor +final class ChatCoordinator: ObservableObject { + @Published var route: Route? + + enum Route { + case settings + case memberList + } +} +``` + +### Dependency Injection +```swift +extension Container { + var chatService: Factory { + Factory(self) { ChatService() } + } +} + +// Usage in ViewModel +@Injected(\.chatService) private var chatService +``` + +## đŸ—‚ī¸ Project Structure + +``` +Anytype/Sources/ +├── ApplicationLayer/ # App lifecycle, coordinators +├── PresentationLayer/ # UI components, ViewModels +├── ServiceLayer/ # Business logic, data services +├── Models/ # Data models, entities +└── CoreLayer/ # Core utilities, networking +``` + +## 🔧 Code Style Quick Reference + +- **Indentation**: 4 spaces (no tabs) +- **Naming**: PascalCase (types), camelCase (variables/functions) +- **Extensions**: `TypeName+Feature.swift` +- **Property order**: @Published/@Injected → public → private → computed → init → methods +- **Avoid nested types** - Extract to top-level with descriptive names +- **Enum exhaustiveness** - Use explicit switch statements (enables compiler warnings) + +## 📚 Complete Documentation + +**Full Guide**: `Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md` + +For comprehensive coverage of: +- Detailed formatting rules +- Swift best practices (guard, @MainActor, async/await) +- Architecture patterns (MVVM, Coordinator, Repository) +- Property organization +- Common mistakes from past incidents +- Testing & mock management +- Complete code examples + +## 🚨 Common Mistakes (Historical) + +### Autonomous Committing (2025-01-28) +**NEVER commit without explicit user request** - Committing is destructive + +### Wildcard File Deletion (2025-01-24) +Used `rm -f .../PublishingPreview*.swift` - deleted main UI component +- Always check with `ls` first +- Delete files individually + +### Incomplete Mock Updates (2025-01-16) +Refactored dependencies but forgot `MockView.swift` +- Search: `rg "oldName" --type swift` +- Update: tests, mocks, DI registrations + +## 🔗 Related Skills & Docs + +- **localization-developer** → `LOCALIZATION_GUIDE.md` - Localization system +- **code-generation-developer** → `CODE_GENERATION_GUIDE.md` - Feature flags, make generate +- **design-system-developer** → `DESIGN_SYSTEM_MAPPING.md` - Icons, typography + +--- + +**Navigation**: This is a smart router. For deep technical details, always refer to `IOS_DEVELOPMENT_GUIDE.md`. diff --git a/.claude/skills/localization-developer/SKILL.md b/.claude/skills/localization-developer/SKILL.md new file mode 100644 index 0000000000..edc0985d23 --- /dev/null +++ b/.claude/skills/localization-developer/SKILL.md @@ -0,0 +1,178 @@ +# Localization Developer (Smart Router) + +## Purpose +Context-aware routing to the Anytype iOS localization system. Helps you navigate the 3-file .xcstrings structure and use Loc constants correctly. + +## When Auto-Activated +- Working with `.xcstrings` files +- Using `Loc` constants +- Discussing hardcoded strings or user-facing text +- Keywords: localization, strings, text, Loc., .xcstrings + +## 🚨 CRITICAL RULES (NEVER VIOLATE) + +1. **NEVER use hardcoded strings in UI** - Always use `Loc` constants +2. **NEVER create duplicate keys** across the 3 .xcstrings files - Breaks code generation +3. **NEVER edit non-English translations** - Only update English (`en`), Crowdin handles others +4. **ALWAYS search for existing keys first** - Reuse before creating new +5. **ALWAYS run `make generate`** after editing .xcstrings files + +## 📋 Quick Workflow + +1. **Search existing**: `rg "yourSearchTerm" Modules/Loc/Sources/Loc/Generated/Strings.swift` +2. **If found**: Reuse existing key +3. **If not found**: Add to appropriate .xcstrings file (see decision tree below) +4. **Generate**: `make generate` +5. **Use**: `AnytypeText(Loc.yourKey, style: .uxCalloutMedium)` + +## đŸ—‚ī¸ The 3-File System + +### Decision Tree + +``` +Is this text for authentication/login/vault? + YES → Auth.xcstrings (86 keys) + NO → Continue + +Is this text for spaces/objects/collaboration? + YES → Workspace.xcstrings (493 keys) + NO → Continue + +Is this text for settings/widgets/general UI? + YES → UI.xcstrings (667 keys) +``` + +### File Locations + +- **Auth.xcstrings**: `Modules/Loc/Sources/Loc/Resources/Auth.xcstrings` +- **Workspace.xcstrings**: `Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings` +- **UI.xcstrings**: `Modules/Loc/Sources/Loc/Resources/UI.xcstrings` + +**Generated output**: All 3 files → single `Strings.swift` (~5,000 lines, 1,246 total keys) + +## đŸŽ¯ Adding Keys + +### Format (add to appropriate .xcstrings file) + +```json +"Your localization key" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your English text here" + } + } + } +} +``` + +**Key naming**: +- Short keys: `"No properties yet"` ✅ +- Not full sentences: `"No properties yet. Add some."` ❌ +- Hierarchical: `"QR.join.title"` → `Loc.Qr.Join.title` + +## đŸ”ĸ Dynamic Localization (Parameters) + +### ✅ CORRECT - Use generated functions + +```swift +// String: "You've reached the limit of %lld editors" +Loc.SpaceLimit.Editors.title(4) + +// String: "Welcome, %@!" +Loc.welcomeMessage("John") +``` + +### ❌ WRONG - Never use String(format:) + +```swift +String(format: Loc.limitReached, 10) // DON'T DO THIS +``` + +**Why**: SwiftGen auto-generates parameterized functions for format specifiers (%lld, %d, %@). + +**Format specifiers**: +- `%lld` → Int parameter +- `%d` → Int parameter +- `%@` → String parameter +- `%.1f` → Double parameter + +## đŸ—‘ī¸ Removing Unused Keys + +1. **Search**: `rg "keyName" --type swift` +2. **If only in Strings.swift**: Key is orphaned +3. **Remove** from source .xcstrings file +4. **Generate**: `make generate` + +## âš ī¸ Common Mistakes + +### Hardcoded Strings +```swift +// ❌ WRONG +Text("Delete") + +// ✅ CORRECT +Text(Loc.delete) +``` + +### Duplicate Keys Across Files +```json +// In Auth.xcstrings +"Settings" : { ... } + +// In UI.xcstrings +"Settings" : { ... } // ❌ DUPLICATE! Breaks generation +``` + +### Using String(format:) +```swift +// ❌ WRONG +String(format: Loc.limitReached, 10) + +// ✅ CORRECT +Loc.limitReached(10) +``` + +### Editing Non-English +```json +// ❌ WRONG - Crowdin will overwrite +"de" : { "value" : "Meine Übersetzung" } + +// ✅ CORRECT - Only edit English +"en" : { "value" : "My translation" } +``` + +## 📚 Complete Documentation + +**Full Guide**: `Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md` + +For comprehensive coverage of: +- Detailed 3-file system explanation +- Key naming patterns and conventions +- Dynamic localization with all format specifiers +- Translation workflow with Crowdin +- Removing orphaned keys +- Generated file structure +- Complete examples and troubleshooting + +## ✅ Workflow Checklist + +- [ ] Searched for existing keys (`rg` in Strings.swift) +- [ ] Added to correct .xcstrings file (Auth/Workspace/UI) +- [ ] No duplicate keys across files +- [ ] Only updated English (`en`) +- [ ] Ran `make generate` +- [ ] Used generated key: `Loc.yourKey` +- [ ] No hardcoded strings in UI + +## 🔗 Related Skills & Docs + +- **ios-dev-guidelines** → `IOS_DEVELOPMENT_GUIDE.md` - Never use hardcoded strings +- **code-generation-developer** → `CODE_GENERATION_GUIDE.md` - Understanding make generate +- **design-system-developer** → Using Loc constants in UI components + +--- + +**Navigation**: This is a smart router. For deep details, always refer to `LOCALIZATION_GUIDE.md`. diff --git a/.claude/skills/skills-manager/SKILL.md b/.claude/skills/skills-manager/SKILL.md new file mode 100644 index 0000000000..4db2dcb391 --- /dev/null +++ b/.claude/skills/skills-manager/SKILL.md @@ -0,0 +1,273 @@ +# Skills Manager (Smart Router) + +## Purpose +Context-aware routing to skills and hooks management. Helps you troubleshoot, fine-tune, and manage the automated documentation system. + +## When Auto-Activated +- Discussing skills activation or hooks +- Keywords: skill activation, hook, troubleshoot, fine-tune, keyword, skill-rules.json +- Debugging why a skill didn't activate or activated incorrectly + +## 🚨 CRITICAL RULES + +1. **Logs are your friend** - Always check `.claude/logs/skill-activations.log` first +2. **Test after changes** - Always verify modifications to `skill-rules.json` work +3. **Validate JSON** - Use `jq` to validate skill-rules.json before committing +4. **Keywords should be specific** - Too-broad keywords cause false positives + +## 📋 Quick Diagnostic Workflow + +### Problem: Skill Didn't Activate + +1. **Check logs**: + ```bash + tail -20 .claude/logs/skill-activations.log + ``` + +2. **Check current keywords**: + ```bash + cat .claude/hooks/skill-rules.json | jq '.skills."SKILL-NAME".promptTriggers.keywords' + ``` + +3. **Add missing keyword**: + - Ask Claude: "Add 'KEYWORD' to SKILL-NAME" + - Or edit `.claude/hooks/skill-rules.json` directly + +4. **Test**: + ```bash + echo '{"prompt":"test prompt"}' | .claude/hooks/skill-activation-prompt.sh + ``` + +### Problem: Skill Activated When Shouldn't + +1. **Identify the trigger** - Check logs to see which keyword matched + +2. **Remove or make more specific**: + - Remove: "Remove 'text' from localization-developer" + - Make specific: Replace "text" with "localized text" + +3. **Verify**: + ```bash + tail .claude/logs/skill-activations.log + ``` + +## đŸŽ¯ Common Tasks + +### Add a Keyword + +**Quick**: Ask Claude +``` +"Add 'refactoring' to ios-dev-guidelines keywords" +``` + +**Manual**: Edit `.claude/hooks/skill-rules.json` +```json +"keywords": [ + "swift", + "refactoring" // ← Add here +] +``` + +### Remove a Keyword + +**Quick**: Ask Claude +``` +"Remove 'text' from localization-developer, it's too broad" +``` + +**Manual**: Edit and remove from keywords array + +### Check What Activated + +```bash +tail -20 .claude/logs/skill-activations.log +``` + +Look for: +``` +✓ Matched: skill-name # ← This skill activated +No matches found # ← Nothing activated +``` + +### Test Activation Manually + +```bash +echo '{"prompt":"add feature flag"}' | .claude/hooks/skill-activation-prompt.sh +``` + +Should output skill suggestion if match found. + +### Auto-Learning Feature + +**What it does**: When a substantial prompt (100+ chars OR 3+ lines) doesn't activate any skills, the system prompts you with available skills and auto-updates keywords based on your feedback. + +**Workflow**: +1. You submit a substantial prompt +2. No skills activate +3. System shows: "Should any of these skills be activated?" +4. You respond: "Yes, localization-developer should activate" +5. Claude extracts keywords from your prompt +6. Claude runs: `.claude/hooks/utils/add-keywords-to-skill.sh localization-developer ` +7. skill-rules.json updated +8. Future similar prompts auto-activate + +**Manual keyword extraction**: +```bash +# Test keyword extraction +echo "Update space settings localization for membership tiers" | .claude/hooks/utils/extract-keywords.sh +# Output: membership, settings, localization, tiers, update + +# Add keywords manually +.claude/hooks/utils/add-keywords-to-skill.sh localization-developer "membership" "tiers" +``` + +**Logs**: +- Missed activations: `.claude/logs/skill-activations-missed.log` +- Learning updates: `.claude/logs/skill-learning.log` + +## 🔧 The System Components + +### Hooks (Automation) + +**Location**: `.claude/hooks/` + +**What they do**: +- `skill-activation-prompt.sh` - Suggests skills based on your prompt +- `post-tool-use-tracker.sh` - Tracks file edits +- `swiftformat-auto.sh` - Auto-formats Swift files + +### Skills (Routers) + +**Location**: `.claude/skills/*/SKILL.md` + +**The 7 skills**: +1. `ios-dev-guidelines` - Swift/iOS patterns +2. `localization-developer` - Localization +3. `code-generation-developer` - Feature flags, make generate +4. `design-system-developer` - Icons, typography, colors +5. `skills-manager` - This skill (meta!) +6. `code-review-developer` - Code review standards +7. `feature-toggle-developer` - Feature toggle removal, cleanup detection + +### Configuration + +**Location**: `.claude/hooks/skill-rules.json` + +**What it contains**: +- Keywords for each skill +- Intent patterns (regex) +- File path patterns +- Priority settings + +## 📊 Configuration Structure + +```json +{ + "skills": { + "skill-name": { + "type": "domain", + "priority": "high", // or "medium", "low" + "description": "Smart router to...", + "promptTriggers": { + "keywords": ["keyword1", "keyword2"], + "intentPatterns": ["(create|add).*?something"] + }, + "fileTriggers": { + "pathPatterns": ["**/*.swift"], + "contentPatterns": ["SomePattern"] + } + } + }, + "config": { + "maxSkillsPerPrompt": 2, + "logActivations": true + } +} +``` + +## âš ī¸ Common Issues + +### Hook Not Executing + +**Symptom**: No activation messages, empty logs + +**Fix**: +```bash +# Make hooks executable +chmod +x .claude/hooks/*.sh + +# Verify +ls -l .claude/hooks/*.sh # Should show rwx +``` + +### Invalid JSON + +**Symptom**: Hook fails silently + +**Fix**: +```bash +# Validate +jq . .claude/hooks/skill-rules.json + +# If error, ask Claude to fix it +``` + +### Too Many False Positives + +**Symptom**: Skill activates too often + +**Fix**: Make keywords more specific +- ❌ "text" → activates for everything +- ✅ "localized text" → more specific + +## 📚 Complete Documentation + +**Full Guide**: `.claude/SKILLS_MANAGEMENT_GUIDE.md` + +For comprehensive coverage of: +- Detailed troubleshooting workflows +- Advanced regex patterns for intent matching +- Creating new skills from scratch +- Monitoring and maintenance +- Log rotation and cleanup +- Complete skill-rules.json reference +- Examples for every scenario + +## ✅ Health Check Commands + +```bash +# Check hook permissions +ls -l .claude/hooks/*.sh + +# Validate configuration +jq . .claude/hooks/skill-rules.json + +# View recent activations +tail -20 .claude/logs/skill-activations.log + +# Count activations by skill +grep "Matched:" .claude/logs/skill-activations.log | sort | uniq -c + +# Test specific prompt +echo '{"prompt":"your test"}' | .claude/hooks/skill-activation-prompt.sh +``` + +## 💡 Pro Tips + +1. **Ask Claude to check logs** - "Check the logs for my last prompt" +2. **Use logs for tuning** - Review regularly to spot patterns +3. **Start broad** - Add broad keywords, narrow if too many false positives +4. **Test everything** - Always test after modifying skill-rules.json +5. **Document changes** - Add comments in skill-rules.json + +## 🔗 Related Docs + +- `.claude/hooks/README.md` - Complete hooks documentation +- `.claude/skills/README.md` - Skills system overview +- `CLAUDE.md` - Main documentation + +--- + +**Navigation**: This is a smart router. For deep troubleshooting and management details, always refer to `SKILLS_MANAGEMENT_GUIDE.md`. + +**Quick help**: Just ask "Check skills system health" or "Why didn't X skill activate?" diff --git a/.claude/skills/tests-developer/SKILL.md b/.claude/skills/tests-developer/SKILL.md new file mode 100644 index 0000000000..417192dd36 --- /dev/null +++ b/.claude/skills/tests-developer/SKILL.md @@ -0,0 +1,477 @@ +# Tests Developer Skill + +Smart router to testing patterns and practices. Writing unit tests, creating mocks, test organization. + +## When to Use This Skill + +This skill activates when working with: +- Writing unit tests +- Creating test mocks +- Testing edge cases +- Test-driven development (TDD) +- Test refactoring and updates +- Swift Testing framework usage +- XCTest framework usage + +## Quick Reference + +### Critical Rules +- ✅ **Use Swift Testing framework** (`import Testing`, `@Test`, `@Suite`) for NEW tests +- ✅ **Keep existing XCTest tests** as-is (don't migrate unless necessary) +- ✅ **Test edge cases**: nil values, empty collections, boundary conditions +- ✅ **Create mock helpers** in test file extensions when needed +- ✅ **Update tests when refactoring** - always search and update references +- ❌ **Never skip tests** for data transformation or business logic +- ❌ **Never use force unwrapping** in tests - use proper assertions + +### Test File Naming +``` +ProductionCode: SetContentViewDataBuilder.swift +Test File: SetContentViewDataBuilderTests.swift +Location: AnyTypeTests/[Category]/[TestFile].swift +``` + +### Swift Testing Framework (Preferred for New Tests) + +**Basic Structure:** +```swift +import Testing +import Foundation +@testable import Anytype +import Services + +@Suite +struct MyFeatureTests { + + private let sut: MyFeature // System Under Test + + init() { + self.sut = MyFeature() + } + + @Test func testSpecificBehavior() { + // Arrange + let input = "test" + + // Act + let result = sut.process(input) + + // Assert + #expect(result == "expected") + } + + @Test func testEdgeCase_EmptyInput_ReturnsNil() { + let result = sut.process("") + #expect(result == nil) + } +} +``` + +**Suite Options:** +```swift +@Suite // Parallel execution (default) +@Suite(.serialized) // Sequential execution (for shared state) +``` + +**Assertions:** +```swift +#expect(value == expected) // Equality +#expect(value != unexpected) // Inequality +#expect(result != nil) // Not nil +#expect(array.isEmpty) // Boolean conditions +#expect(throws: SomeError.self) { // Error throwing + try throwingFunction() +} +``` + +### XCTest Framework (Legacy Tests) + +**Basic Structure:** +```swift +import XCTest +@testable import Anytype + +final class MyFeatureTests: XCTestCase { + + var sut: MyFeature! + + override func setUpWithError() throws { + sut = MyFeature() + } + + override func tearDownWithError() throws { + sut = nil + } + + func testSpecificBehavior() { + // Arrange + let input = "test" + + // Act + let result = sut.process(input) + + // Assert + XCTAssertEqual(result, "expected") + } +} +``` + +**Common Assertions:** +```swift +XCTAssertEqual(actual, expected) +XCTAssertNotEqual(actual, unexpected) +XCTAssertNil(value) +XCTAssertNotNil(value) +XCTAssertTrue(condition) +XCTAssertFalse(condition) +XCTAssertThrowsError(try expression) +``` + +## Test Organization Patterns + +### 1. Edge Case Testing (Critical) + +Always test these scenarios: +```swift +@Test func testEmptyInput() { + let result = sut.process([]) + #expect(result.isEmpty) +} + +@Test func testNilInput() { + let result = sut.process(nil) + #expect(result == nil) +} + +@Test func testSingleItem() { + let result = sut.process([item]) + #expect(result.count == 1) +} + +@Test func testBoundaryCondition() { + let items = (0..<100).map { Item(id: "\($0)") } + let result = sut.process(items) + #expect(result.count <= 100) +} + +@Test func testTruncation_LimitsToMax() { + let attachments = (0..<5).map { ObjectDetails.mock(id: "item\($0)") } + let result = sut.truncate(attachments, limit: 3) + #expect(result.count == 3) + #expect(result[0].id == "item0") + #expect(result[2].id == "item2") +} +``` + +### 2. Mock Helpers (In Test File) + +**Location:** Create as extensions in the same test file +```swift +// At bottom of test file +extension ObjectDetails { + static func mock(id: String) -> ObjectDetails { + ObjectDetails(id: id, values: [:]) + } +} + +extension Participant { + static func mock( + id: String, + globalName: String = "", + icon: ObjectIcon? = nil + ) -> Participant { + Participant( + id: id, + localName: "", + globalName: globalName, + icon: icon, + status: .active, + permission: .reader, + identity: "", + identityProfileLink: "", + spaceId: "", + type: "" + ) + } +} +``` + +### 3. Dependency Injection in Tests + +**Using Factory Pattern:** +```swift +@Suite(.serialized) // Required for DI setup +struct MyFeatureTests { + + private let mockService: MyServiceMock + + init() { + let mockService = MyServiceMock() + Container.shared.myService.register { mockService } + self.mockService = mockService + } + + @Test func testWithMockedDependency() { + mockService.expectedResult = "test" + let sut = MyFeature() + let result = sut.doWork() + #expect(result == "test") + } +} +``` + +### 4. Testing Protocols (Make Methods Internal) + +**Problem:** Private methods can't be tested +**Solution:** Use `internal` access and test via protocol +```swift +// Production code - SetContentViewDataBuilder.swift +final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { + + // ✅ Internal for testing (not private) + func buildChatPreview( + objectId: String, + spaceView: SpaceView?, + chatPreviewsDict: [String: ChatMessagePreview] + ) -> MessagePreviewModel? { + // Implementation + } +} + +// Test code +@Test func testBuildChatPreview_EmptyDict_ReturnsNil() { + let result = builder.buildChatPreview( + objectId: "test", + spaceView: nil, + chatPreviewsDict: [:] + ) + #expect(result == nil) +} +``` + +### 5. Dictionary Conversion Testing + +**Performance validation:** +```swift +@Test func testDictionaryConversion_EmptyArray() { + let items: [Item] = [] + let dict = Dictionary(uniqueKeysWithValues: items.map { ($0.id, $0) }) + #expect(dict.isEmpty) +} + +@Test func testDictionaryConversion_MultipleItems() { + let items = (0..<10).map { Item(id: "item\($0)") } + let dict = Dictionary(uniqueKeysWithValues: items.map { ($0.id, $0) }) + + #expect(dict.count == 10) + for i in 0..<10 { + #expect(dict["item\(i)"] != nil) + } +} + +@Test func testDictionaryLookup_O1Performance() { + let items = (0..<100).map { Item(id: "item\($0)") } + let dict = Dictionary(uniqueKeysWithValues: items.map { ($0.id, $0) }) + + let result = dict["item50"] + #expect(result != nil) + #expect(result?.id == "item50") +} +``` + +### 6. Testing with Dates + +```swift +@Test func testDateFormatting() { + let date = Date(timeIntervalSince1970: 1700000000) + let result = formatter.format(date) + #expect(result.isEmpty == false) +} + +@Test func testDateComparison() { + let now = Date() + let future = now.addingTimeInterval(3600) + #expect(future > now) +} +``` + +### 7. Testing Protobuf Models + +**ChatState example:** +```swift +@Test func testChatStateCounters() { + var chatState = ChatState() + + var messagesState = ChatState.UnreadState() + messagesState.counter = 5 + chatState.messages = messagesState + + var mentionsState = ChatState.UnreadState() + mentionsState.counter = 2 + chatState.mentions = mentionsState + + #expect(chatState.messages.counter == 5) + #expect(chatState.mentions.counter == 2) +} +``` + +## Mock Services Pattern + +### Preview Mocks (for SwiftUI Previews) + +**Location:** `Anytype/Sources/PreviewMocks/` + +**Usage:** +```swift +import SwiftUI + +#Preview { + MockView { + // Configure mock state + SpaceViewsStorageMock.shared.workspaces = [...] + } content: { + MyView() + } +} +``` + +### Test Mocks (for Unit Tests) + +**Location:** `AnyTypeTests/Mocks/` or in test file + +**Pattern:** +```swift +@testable import Anytype + +final class MyServiceMock: MyServiceProtocol { + var callCount = 0 + var capturedInput: String? + var stubbedResult: Result? + + func process(_ input: String) -> Result { + callCount += 1 + capturedInput = input + return stubbedResult ?? .default + } +} +``` + +## Testing Checklist + +When writing tests, ensure: +- [ ] Test happy path (valid input, expected output) +- [ ] Test edge cases (nil, empty, boundary conditions) +- [ ] Test error conditions (invalid input, throwing functions) +- [ ] Test data transformations (truncation, filtering, mapping) +- [ ] Test performance assumptions (O(1) lookups, O(n) operations) +- [ ] Create mock helpers for complex types +- [ ] Use descriptive test names: `testFeature_Condition_ExpectedBehavior` +- [ ] Follow AAA pattern: Arrange, Act, Assert +- [ ] No force unwrapping (`!`) - use proper assertions +- [ ] Import only necessary modules (`@testable import Anytype`) + +## When Refactoring Production Code + +**CRITICAL:** Always update tests when refactoring: + +1. **Search for test references:** +```bash +rg "OldClassName" AnyTypeTests/ --type swift +rg "oldPropertyName" AnyTypeTests/ --type swift +``` + +2. **Update test mocks:** + - Check `AnyTypeTests/Mocks/` + - Check `Anytype/Sources/PreviewMocks/` + - Update DI registrations in `MockView.swift` + +3. **Update mock extensions:** + - Search for `.mock(` in test files + - Update parameters if initializer changed + +4. **Run tests before committing:** + - User will verify in Xcode (faster with caches) + - Report all test file changes to user + +## Common Test Patterns in Codebase + +### Pattern 1: Builder Testing +```swift +@Test func testBuilderCreatesCorrectModel() { + let input = [...setup...] + let result = builder.build(input) + + #expect(result.property1 == expected1) + #expect(result.property2 == expected2) + #expect(result.collection.count == 3) +} +``` + +### Pattern 2: Storage/Repository Testing +```swift +@Suite(.serialized) +struct StorageTests { + init() { + // Setup mock dependencies + } + + @Test func testSaveAndRetrieve() { + storage.save(item) + let retrieved = storage.get(item.id) + #expect(retrieved?.id == item.id) + } +} +``` + +### Pattern 3: Parser/Formatter Testing +```swift +@Test func testParseValidInput() { + let result = parser.parse("valid input") + #expect(result != nil) +} + +@Test func testParseInvalidInput_ReturnsNil() { + let result = parser.parse("") + #expect(result == nil) +} +``` + +### Pattern 4: Counter/State Testing +```swift +@Test func testCountersPropagation() { + var model = Model() + model.state = createState(messages: 5, mentions: 2) + + #expect(model.unreadCounter == 5) + #expect(model.mentionCounter == 2) +} +``` + +## Test File Examples + +### Example 1: SetContentViewDataBuilderTests.swift +**Full working example:** `AnyTypeTests/Services/SetContentViewDataBuilderTests.swift` +- Tests builder methods +- Creates mock helpers +- Tests edge cases (nil, empty, truncation) +- Tests counter propagation +- Tests dictionary conversion performance + +### Example 2: ChatMessageLimitsTests.swift +**Full working example:** `AnyTypeTests/Services/ChatMessageLimitsTests.swift` +- Uses @Suite(.serialized) for DI setup +- Mocks date provider via Factory DI +- Tests rate limiting logic +- Tests time-based conditions + +## Related Documentation + +- **CLAUDE.md**: Project guidelines, no comments rule, testing requirements +- **IOS_DEVELOPMENT_GUIDE.md**: Swift patterns, MVVM architecture +- **.claude/CODE_REVIEW_GUIDE.md**: Review standards including test updates + +--- + +**Navigation**: This is a smart router. For comprehensive testing guidelines and architecture patterns, refer to `IOS_DEVELOPMENT_GUIDE.md`. + +**Quick help**: Just ask "How do I test X?" or "Create tests for Y feature" diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..a9ee6a3196 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,56 @@ +# EditorConfig - Ensures consistent coding styles across editors and IDEs +# https://editorconfig.org + +root = true + +# Swift files +[*.swift] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = false # CRITICAL: Preserve whitespace on blank lines +max_line_length = 140 + +# YAML files (Fastlane, workflows, configs) +[*.{yml,yaml}] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +# JSON files (Xcode assets, configs) +[*.json] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +# Markdown files +[*.md] +charset = utf-8 +indent_style = space +indent_size = 2 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = false # Preserve trailing spaces (used for line breaks) + +# Makefiles (MUST use tabs) +[Makefile] +indent_style = tab +insert_final_newline = true +trim_trailing_whitespace = true + +# Shell scripts +[*.sh] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.github/WORKFLOWS_REFERENCE.md b/.github/WORKFLOWS_REFERENCE.md new file mode 100644 index 0000000000..5134c842c5 --- /dev/null +++ b/.github/WORKFLOWS_REFERENCE.md @@ -0,0 +1,415 @@ +# GitHub Workflows & Actions Reference + +This document provides an overview of GitHub workflows, custom actions, and automation in the Anytype iOS repository. For implementation details, refer to the source files in `.github/workflows/` and `.github/actions/`. + +## Table of Contents + +- [Quick Reference](#quick-reference) +- [Workflows](#workflows) + - [CI/CD Workflows](#cicd-workflows) + - [Automation Workflows](#automation-workflows) + - [Code Quality Workflows](#code-quality-workflows) + - [AI/Code Review Workflows](#aicode-review-workflows) + - [Utility Workflows](#utility-workflows) +- [Custom Actions](#custom-actions) +- [Auto-merge System](#auto-merge-system) +- [Required Secrets & Variables](#required-secrets--variables) +- [Runner Configuration](#runner-configuration) +- [Best Practices](#best-practices) + +## Quick Reference + +| Workflow | Trigger | Purpose | +|----------|---------|---------| +| `pr_tests.yml` | PR, manual | Run unit tests on PRs | +| `generator_checks.yaml` | PR, manual | Verify generated files are up-to-date | +| `automerge.yaml` | PR from `any-association` | Auto-approve and merge bot PRs | +| `update_middleware.yaml` | Manual, called | Update middleware version | +| `update_middleware_nightly.yaml` | Schedule (weekdays 03:00 UTC), manual | Update to latest nightly middleware | +| `branch_build.yaml` | Manual | Build and upload branch to TestFlight | +| `dev_build.yaml` | Schedule (weekdays 05:00 UTC), manual | Daily dev build to TestFlight | +| `claude-code-review.yml` | PR opened | AI-powered code review with Claude | + +## Workflows + +### CI/CD Workflows + +#### `pr_tests.yml` - Unit Tests +**File:** `.github/workflows/pr_tests.yml` +**Triggers:** Pull requests, manual dispatch +**Purpose:** Runs unit tests on all PRs to ensure code quality before merge. Uses Xcode cache for faster builds and cancels in-progress runs when new commits are pushed. + +--- + +#### `branch_build.yaml` - Manual TestFlight Upload +**File:** `.github/workflows/branch_build.yaml` +**Triggers:** Manual dispatch only +**Purpose:** Builds the current branch and uploads to TestFlight with an optional comment. Sends Slack notification on completion. +**Inputs:** `tf_comment` (optional TestFlight comment) +**Notable:** Does not cancel in-progress builds + +--- + +#### `dev_build.yaml` - Scheduled Dev Builds +**File:** `.github/workflows/dev_build.yaml` +**Triggers:** Schedule (weekdays at 05:00 UTC), manual dispatch +**Purpose:** Automated daily dev builds uploaded to TestFlight for team testing. Tests are allowed to fail (continue-on-error: true) to ensure builds proceed even with test failures. + +--- + +#### `release_build.yaml` - Production Releases +**File:** `.github/workflows/release_build.yaml` +**Triggers:** Manual dispatch, workflow call +**Purpose:** Builds production releases for App Store submission with production configurations and stricter quality checks. + +--- + +#### `ipa.yaml` - IPA Build +**File:** `.github/workflows/ipa.yaml` +**Triggers:** Manual dispatch, repository dispatch (triggers test run repository after build) +**Purpose:** Builds IPA file for the application. After successful build, triggers automated tests in the anytype-test repository. +**Purpose:** Builds IPA file for the application. Invoked from the test run repository for automated testing. + +--- + +### Automation Workflows + +#### `automerge.yaml` - Automatic PR Merge +**File:** `.github/workflows/automerge.yaml` +**Triggers:** `pull_request_target` events +**Purpose:** Automatically approves and merges PRs created by the `any-association` account. Only runs when `github.actor == 'any-association'`, enables auto-merge with squash strategy after approval. PR will merge automatically once all required checks pass. +**Use cases:** Automated dependency updates, middleware updates, and other bot-generated PRs. + +--- + +#### `update_middleware.yaml` - Middleware Version Update +**File:** `.github/workflows/update_middleware.yaml` +**Triggers:** Manual dispatch with inputs, workflow call (reusable) +**Purpose:** Updates the middleware version, creates a PR, and optionally closes the Linear issue. + +**Inputs:** +- `middle_version` (required) - Middleware version (e.g., "v0.44.0") +- `task_name` (optional) - Linear task ID (e.g., "IOS-5140") for branch naming and issue closing + +**Process:** Checks current version in Libraryfile → Updates version if different → Downloads binaries → Regenerates protobuf → Runs tests → Creates PR → Closes Linear issue (if task_name provided) + +**Branch naming:** +- With task: `IOS-5140-update-middleware-v0.44.0` +- Without task: `update-middleware-v0.44.0` + +**Important:** +- PRs are created using `SERVICE_USER_GITHUB_TOKEN` (associated with `any-association` account) +- Auto-merge is handled automatically by `automerge.yaml` workflow (no manual intervention needed) +- PR will merge automatically when all required checks pass +- Linear issue is closed when PR is created (not when merged) + +--- + +#### `update_middleware_nightly.yaml` - Nightly Middleware Updates +**File:** `.github/workflows/update_middleware_nightly.yaml` +**Triggers:** Schedule (weekdays at 03:00 UTC), manual dispatch +**Purpose:** Automatically updates to the latest nightly middleware build. Resolves latest nightly version via `Scripts/get-latest-nightly.sh`, then calls `update_middleware.yaml` as a reusable workflow. Sends Slack notification on failure. + +--- + +### Code Quality Workflows + +#### `generator_checks.yaml` - Generated Files Validation +**File:** `.github/workflows/generator_checks.yaml` +**Triggers:** Pull requests, manual dispatch +**Purpose:** Ensures all generated files are up-to-date by running `make generate` and checking for modifications. Fails if files are modified, indicating developer forgot to run generators. +**Error message:** "Generated files are not up to date. Please run 'make generate' and commit the changes." +**Why:** Prevents PRs from being merged with stale generated files (localization strings, assets, protobuf, etc.) + +--- + +#### `license-checks.yml` - License Compliance +**File:** `.github/workflows/license-checks.yml` +**Triggers:** Pull requests, manual dispatch +**Purpose:** Validates that all dependencies have approved licenses. Clones `anyproto/open` repository for license definitions and runs Fastlane license check. + +--- + +#### `cla.yml` - Contributor License Agreement +**File:** `.github/workflows/cla.yml` +**Triggers:** Pull requests from external contributors +**Purpose:** Ensures external contributors have signed the CLA. + +--- + +### AI/Code Review Workflows + +#### `claude-code-review.yml` - AI Code Review +**File:** `.github/workflows/claude-code-review.yml` +**Triggers:** Pull requests (only on `opened` event) +**Purpose:** Provides AI-powered code review using Claude Code. Reviews are lean and actionable - only reports actual issues (bugs, best practices violations, performance problems, security vulnerabilities), no praise or design suggestions. Can post inline code suggestions using GitHub's suggestion blocks. +**Review status:** ✅ Approved (no issues), âš ī¸ Minor Issues (non-critical), 🚨 Major Issues (critical) +**Notable:** Uses CLAUDE.md for project-specific conventions and validates runner/Xcode version mappings. + +--- + +#### `claude.yml` - Claude Integration +**File:** `.github/workflows/claude.yml` +**Triggers:** Various events (project-specific) +**Purpose:** General Claude AI integration for automation tasks. + +--- + +### Utility Workflows + +#### `update_cache.yaml` - Cache Management +**File:** `.github/workflows/update_cache.yaml` +**Triggers:** Manual dispatch, scheduled +**Purpose:** Pre-warms GitHub Actions cache for faster builds. Caches local tools, Xcode derived data, and Swift package dependencies. + +--- + +#### `test_fastlane_build.yaml` - Workflow Development Testing +**File:** `.github/workflows/test_fastlane_build.yaml` +**Triggers:** Manual dispatch +**Purpose:** Test workflow used when developing new GitHub workflows. Helps test workflow changes before merging to dev branch. +**Note:** Due to GitHub limitations, new workflow files are not visible in the Actions UI until merged into the dev branch. + +--- + +## Custom Actions + +Custom actions are reusable components located in `.github/actions/`. See individual action directories for implementation details. + +### `prepare-deps` +**Location:** `.github/actions/prepare-deps` +**Purpose:** Sets up Ruby, Bundler, and Homebrew tools (imagemagick, libgit2) +**Used by:** Nearly all workflows that need build dependencies + +--- + +### `update-git-config` +**Location:** `.github/actions/update-git-config` +**Purpose:** Configures git user for automated commits +**Used by:** Workflows that create commits (branch_build, dev_build, update_middleware) + +--- + +### `send-slack-message` +**Location:** `.github/actions/send-slack-message` +**Purpose:** Sends Slack direct messages to workflow initiators based on job status +**Inputs:** success_message, error_message, status, slack_token, slack_map +**Used by:** branch_build, dev_build, release_build +**Configuration:** Add your GitHub username and work email to `SLACK_MAP` repository variable to receive notifications + +--- + +### `license-checks` +**Location:** `.github/actions/license-checks` +**Purpose:** Validates dependency licenses against approved list from `anyproto/open` repository +**Used by:** license-checks workflow + +--- + +## Auto-merge System + +### Overview +The repository uses a **centralized auto-merge system** via the `automerge.yaml` workflow. Any PR created by the `any-association` account is automatically approved and merged when all checks pass. + +### How It Works + +#### `automerge.yaml` Workflow +- **Trigger:** All PRs (via `pull_request_target`) +- **Condition:** Only runs if `github.actor == 'any-association'` +- **Actions:** + 1. Auto-approves the PR + 2. Enables auto-merge with `--squash` strategy + 3. PR merges automatically when all required checks pass + +#### What Gets Auto-merged +- All PRs from the `any-association` account, including: + - Automated dependency updates + - Middleware updates (via `update_middleware.yaml`) + - Other bot-generated changes +- Individual workflows don't need explicit auto-merge steps - it's handled centrally + +#### What Does NOT Get Auto-merged +- PRs from human developers +- PRs from other bot accounts + +### Configuration + +**For automated workflows:** +- Use `SERVICE_USER_GITHUB_TOKEN` to create PRs (associated with `any-association` account) +- The `automerge.yaml` workflow handles approval and auto-merge automatically +- No need to include auto-merge steps in individual workflow files + +**For manual PRs:** +- Create PR using your own account or other tokens +- PR will require manual review and merge + +--- + +## Required Secrets & Variables + +### Secrets + +| Secret | Purpose | Used By | +|--------|---------|---------| +| `SERVICE_USER_GITHUB_TOKEN` | GitHub token for creating PRs and pushing changes | update_middleware, generator_checks | +| `MIDDLEWARE_TOKEN` | Token for accessing middleware repository | All workflows that download middleware | +| `LINEAR_TOKEN` | Linear API token for closing issues | update_middleware, branch_build | +| `SSH_ACCESS_KEY` | SSH key for accessing private repositories | branch_build, dev_build, release_build | +| `SSH_KEY_FASTLANE_MATCH` | SSH key for Fastlane Match (code signing) | All build workflows | +| `MATCH_PASSWORD` | Password for Fastlane Match encryption | All build workflows | +| `APP_STORE_CONNECT_API_KEY_ID` | App Store Connect API key ID | All build workflows | +| `APP_STORE_CONNECT_API_ISSUER_ID` | App Store Connect API issuer ID | All build workflows | +| `APP_STORE_CONNECT_API_PRIVATE_KEY` | App Store Connect API private key | All build workflows | +| `SENTRY_AUTH_TOKEN` | Sentry authentication token for crash reporting | All build workflows | +| `SENTRY_DSN` | Sentry DSN for crash reporting | All build workflows | +| `AMPLITUDE_API_KEY` | Amplitude analytics API key | All build workflows | +| `SLACK_BOT_TOKEN` | Slack bot token for notifications | send-slack-message action | +| `SLACK_URL_BUILD_TESTS` | Slack webhook for build/test notifications | update_middleware_nightly | +| `CLAUDE_CODE_OAUTH_TOKEN` | OAuth token for Claude Code API access | claude-code-review | + +### Variables + +| Variable | Purpose | Used By | +|----------|---------|---------| +| `SLACK_MAP` | JSON mapping of GitHub usernames to work emails | send-slack-message action | + +**Example SLACK_MAP:** +```json +{ + "githubUsername1": "user1@anytype.io", + "githubUsername2": "user2@anytype.io" +} +``` + +--- + +## Runner Configuration + +### Available Runners + +| Runner | Xcode Version | Use Case | +|--------|--------------|----------| +| `macos-15` | Xcode 15.x (e.g., 15.4) | Legacy builds, older Xcode requirements | +| `macos-26` | Xcode 26.1 | **Current standard** - All modern builds | +| `ubuntu-latest` | N/A | Utility jobs, scripts, API calls | + +### Runner-Xcode Version Mapping + +**Critical rule:** The `xcode-version` in `setup-xcode` must match the capabilities of the `runs-on` runner. + +**Current standard configuration:** +```yaml +jobs: + build: + runs-on: macos-26 + steps: + - name: Setup Xcode + uses: maxim-lobanov/setup-xcode@v1.6.0 + with: + xcode-version: '26.1' +``` + +### Reference Documentation +- [macos-15 Readme](https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md) +- [macos-26 ARM64 Readme](https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md) +- [All Runner Images](https://github.com/actions/runner-images/tree/main/images/macos) + +**Note:** Claude Code Review workflow validates runner/Xcode version mappings in PRs. + +--- + +## Best Practices + +### When to Use Which Workflow + +**For development:** +- **Local changes:** Use `make generate` and test locally +- **PR testing:** `pr_tests.yml` runs automatically +- **Quick TestFlight build:** Use `branch_build.yaml` manually + +**For middleware updates:** +- **Manual version update:** Use `update_middleware.yaml` with specific version +- **Latest nightly:** Let `update_middleware_nightly.yaml` run automatically, or trigger manually +- **Auto-merge:** PRs are automatically merged by `automerge.yaml` when all checks pass +- **Note:** Tests passing is required for merge, but doesn't guarantee full compatibility - monitor for issues + +**For releases:** +- Use `release_build.yaml` for production builds +- Ensure all tests pass and code review is complete + +### Modifying Workflows Safely + +1. **Test locally first:** + ```bash + # Validate YAML syntax + cat .github/workflows/your-workflow.yaml | ruby -ryaml -e "YAML.load(STDIN.read)" + ``` + +2. **Use small, incremental changes:** + - Modify one workflow at a time + - Test with `workflow_dispatch` trigger + - Review workflow run logs carefully + +3. **Understand dependencies:** + - Check if workflow calls other workflows + - Verify secrets and variables are available + - Ensure runner has necessary tools + +4. **For runner/Xcode changes:** + - Verify compatibility: [Runner Images Documentation](https://github.com/actions/runner-images) + - Update both `runs-on` and `xcode-version` together + - Test build workflow after changes + +5. **Update this documentation:** + - When adding new workflows, document them here + - When changing behavior, update relevant sections + - When adding secrets, document their purpose + +### Common Issues and Solutions + +**Issue:** Generated files check fails on PR +- **Solution:** Run `make generate` locally and commit changes + +**Issue:** Middleware update PR created but tests fail +- **Solution:** PR will not auto-merge until tests pass. Review the failures and push fixes to the PR branch. Once tests pass, auto-merge will proceed automatically. + +**Issue:** Workflow run fails with "Resource not accessible by integration" +- **Solution:** Check `permissions:` block in workflow, ensure necessary permissions are granted + +**Issue:** Slack notifications not received +- **Solution:** Add your GitHub username and email to `SLACK_MAP` repository variable + +**Issue:** Auto-merge not working +- **Solution:** Verify PR is from `any-association` account and all required checks pass + +--- + +## Maintenance + +### Regular Tasks + +**Weekly:** +- Review failed workflow runs +- Check for outdated action versions + +**Monthly:** +- Review and update runner versions if needed +- Audit secrets for expiration +- Review auto-merge behavior + +**Quarterly:** +- Update third-party actions to latest versions +- Review and optimize workflow performance +- Update this documentation + +### Getting Help + +- **Workflow failures:** Check workflow run logs in GitHub Actions tab +- **Runner issues:** Consult [GitHub Actions Runner Images](https://github.com/actions/runner-images) +- **Fastlane issues:** Check `fastlane/Fastfile` and Fastlane documentation +- **Xcode issues:** Verify Xcode version compatibility with runner + +--- + +**Last Updated:** 2025-10-29 +**Maintainers:** iOS Team diff --git a/.github/workflows/branch_build.yaml b/.github/workflows/branch_build.yaml index 61b4de492f..89da4bc9e1 100644 --- a/.github/workflows/branch_build.yaml +++ b/.github/workflows/branch_build.yaml @@ -14,7 +14,7 @@ concurrency: jobs: main: - runs-on: macos-15 + runs-on: macos-26 steps: - name: Checkout @@ -36,7 +36,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci @@ -58,11 +58,6 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} LINEAR_TOKEN: ${{ secrets.LINEAR_TOKEN }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} - OPENAI_TOKEN: ${{ secrets.OPENAI_TOKEN }} - AI_ENDPOINT: ${{ secrets.AI_ENDPOINT }} - AI_MODEL: ${{ secrets.AI_MODEL }} - ANY_APP_MEMBERSHIP_TIER_SECRET: ${{ secrets.ANY_APP_MEMBERSHIP_TIER_SECRET }} - JOIN_STREAM_URL: ${{ secrets.JOIN_STREAM_URL }} FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 900 FASTLANE_XCODEBUILD_SETTINGS_RETRIES: 4 diff --git a/.github/workflows/claude-code-review.yml b/.github/workflows/claude-code-review.yml index 457ec4d1c2..dcce762ac7 100644 --- a/.github/workflows/claude-code-review.yml +++ b/.github/workflows/claude-code-review.yml @@ -2,7 +2,7 @@ name: Claude Code Review on: pull_request: - types: [opened] + types: [opened, synchronize] # Optional: Only run on specific file changes # paths: # - "src/**/*.ts" @@ -31,6 +31,28 @@ jobs: with: fetch-depth: 1 + - name: Load review skill and CI automation + id: load-prompt + run: | + # Load the code-review-developer skill (routes to general standards) + SKILL_CONTENT=$(cat .claude/skills/code-review-developer/SKILL.md) + + # Load CI-specific automation instructions + CI_AUTOMATION=$(cat .github/workflows/pr-review-automation.md) + + # Combine both for the prompt + PROMPT_CONTENT="${SKILL_CONTENT} + + --- + + # CI/PR-Specific Instructions + + ${CI_AUTOMATION}" + + echo "prompt_content<> $GITHUB_OUTPUT + echo "$PROMPT_CONTENT" >> $GITHUB_OUTPUT + echo "EOF" >> $GITHUB_OUTPUT + - name: Run Claude Code Review id: claude-review uses: anthropics/claude-code-action@v1 @@ -41,56 +63,7 @@ jobs: PR NUMBER: ${{ github.event.pull_request.number }} COMMIT SHA: ${{ github.event.pull_request.head.sha }} - Review this PR using CLAUDE.md for project conventions. Be LEAN and ACTIONABLE - only provide value, avoid noise. - - RULES: - - ONLY include sections when there are ACTUAL issues to report - - NO "Strengths" or praise sections - - NO "no concerns" statements (skip the section entirely) - - NO design/UI/spacing suggestions (padding, margins, colors, etc.) - you cannot see the visual design - - Reference specific file:line locations for issues - - If no issues found: comment "✅ **Approved** - No issues found" - - SECTIONS (include ONLY if issues exist): - - **Bugs/Issues**: Logic errors, potential bugs that need fixing - - **Best Practices**: Violations of Swift/SwiftUI conventions or CLAUDE.md guidelines (code quality only, not design) - - **Performance**: Actual performance problems (not theoretical) - - **Security**: Real security vulnerabilities - - END WITH: - - **Summary**: ONE sentence only with status emoji: - - ✅ **Approved** - [brief reason] - - âš ī¸ **Minor Issues** - [what needs fixing] - - 🚨 **Major Issues** - [critical problems] - - IMPORTANT - Review Comment Strategy: - 1. Post inline comments for EACH specific code issue using the GitHub API directly. - 2. Post a final summary comment at the end. - - For inline comments, use this exact format: - - COMMIT_SHA="${{ github.event.pull_request.head.sha }}" - gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews \ - --method POST \ - --field body="Your summary here (can be empty if you have inline comments)" \ - --field event="COMMENT" \ - --field comments[][path]="Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift" \ - --field comments[][line]=274 \ - --field comments[][body]="Your inline comment here" - - You can add multiple --field comments[][...] entries in a single command for multiple inline comments. - - Example: - gh api repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/reviews \ - --method POST \ - --field body="Found potential race condition" \ - --field event="COMMENT" \ - --field comments[][path]="Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift" \ - --field comments[][line]=274 \ - --field comments[][body]="**Potential Race Condition**: canAddWriters is computed using participants array (line 274), but participants is updated asynchronously in startJoiningTask() which runs in parallel with startParticipantTask()." - - Then post a final summary comment: - gh pr comment ${{ github.event.pull_request.number }} --body "Review complete - see inline comments for details" + ${{ steps.load-prompt.outputs.prompt_content }} # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md # or https://docs.claude.com/en/docs/claude-code/cli-reference for available options diff --git a/.github/workflows/dev_build.yaml b/.github/workflows/dev_build.yaml index 170fa3ac42..8d6650a922 100644 --- a/.github/workflows/dev_build.yaml +++ b/.github/workflows/dev_build.yaml @@ -37,7 +37,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci @@ -67,11 +67,6 @@ jobs: SENTRY_DSN: ${{ secrets.SENTRY_DSN }} LINEAR_TOKEN: ${{ secrets.LINEAR_TOKEN }} AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} - OPENAI_TOKEN: ${{ secrets.OPENAI_TOKEN }} - AI_ENDPOINT: ${{ secrets.AI_ENDPOINT }} - AI_MODEL: ${{ secrets.AI_MODEL }} - ANY_APP_MEMBERSHIP_TIER_SECRET: ${{ secrets.ANY_APP_MEMBERSHIP_TIER_SECRET }} - JOIN_STREAM_URL: ${{ secrets.JOIN_STREAM_URL }} FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 900 FASTLANE_XCODEBUILD_SETTINGS_RETRIES: 4 diff --git a/.github/workflows/generator_checks.yaml b/.github/workflows/generator_checks.yaml index b0bbbbb835..a1d63cb6fa 100644 --- a/.github/workflows/generator_checks.yaml +++ b/.github/workflows/generator_checks.yaml @@ -11,7 +11,7 @@ on: jobs: unit-tests: name: Check - runs-on: macos-15 + runs-on: macos-26 steps: - name: Checkout diff --git a/.github/workflows/ipa.yaml b/.github/workflows/ipa.yaml index a9e4d19490..e2a250a168 100644 --- a/.github/workflows/ipa.yaml +++ b/.github/workflows/ipa.yaml @@ -16,7 +16,7 @@ on: jobs: main: - runs-on: macos-15 + runs-on: macos-26 steps: - name: Checkout @@ -30,7 +30,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci diff --git a/.github/workflows/license-checks.yml b/.github/workflows/license-checks.yml index c2a9fb4f47..35ec334b72 100644 --- a/.github/workflows/license-checks.yml +++ b/.github/workflows/license-checks.yml @@ -7,7 +7,7 @@ on: jobs: license-checks: name: License Checks - runs-on: macos-15 + runs-on: macos-26 steps: - name: Checkout @@ -29,7 +29,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci diff --git a/.github/workflows/pr-review-automation.md b/.github/workflows/pr-review-automation.md new file mode 100644 index 0000000000..8530cddb3c --- /dev/null +++ b/.github/workflows/pr-review-automation.md @@ -0,0 +1,122 @@ +# Claude Code Review Prompt (GitHub Actions) + +## Context Variables +- **REPO**: Repository name (injected by workflow) +- **PR NUMBER**: Pull request number (injected by workflow) +- **COMMIT SHA**: Commit SHA being reviewed (injected by workflow) + +## 🚨 CRITICAL OUTPUT RULES + +**If NO issues found:** +``` +✅ **Approved** - No issues found +``` + +**DO NOT add ANY additional text:** +- ❌ NO "The PR correctly implements..." +- ❌ NO explanations of what changed +- ❌ NO lists of what was added/cleaned +- ❌ NO implementation details +- ❌ ONLY the one-line approval message above + +**If issues ARE found:** +Follow the format from `.claude/skills/code-review-developer/SKILL.md` + +## CI-Specific Reference Documentation + +### Valid GitHub Actions Runners +https://github.com/actions/runner-images/tree/main/images/macos + +### macOS Runner to Xcode Version Mapping +- `macos-15`: Xcode 15.x (e.g., '15.4') - See https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md +- `macos-26`: Xcode 26.1 (at /Applications/Xcode_26.1.app) - See https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md + +**VALIDATION RULE**: When reviewing xcode-version in workflows, verify it matches the runs-on runner version using the mapping above. + +## Review Comment Strategy + +### 1. Small, Localized Issues (Preferred) +For issues affecting a single chunk of code: +- Use GitHub's suggestion mechanism to propose the fix inline +- Include the fixed code in a suggestion block +- Add brief explanation above the suggestion + +**Format**: +```suggestion +fixed code here +``` + +**Example**: +```bash +gh api repos/${REPO}/pulls/${PR_NUMBER}/reviews \ + --method POST \ + --field body="" \ + --field event="COMMENT" \ + --field comments[][path]="fastlane/FastlaneComment" \ + --field comments[][line]=45 \ + --field comments[][body]="**Code Quality**: This single-line command is fragile. Consider breaking into multiple lines: +\`\`\`suggestion +sh(\"export PKG_CONFIG_PATH=/opt/homebrew/lib/pkgconfig:/usr/local/lib/pkgconfig:\$PKG_CONFIG_PATH\") +sh(\"source venv/bin/activate && pip3 install -r requirements.txt && python3 release-utils/main.py\") +\`\`\`" +``` + +### 2. Broader Issues (Multiple Locations) +For issues spanning multiple files or no immediate fix: + +**Format**: +```bash +gh api repos/${REPO}/pulls/${PR_NUMBER}/reviews \ + --method POST \ + --field body="Your summary here (can be empty if you have inline comments)" \ + --field event="COMMENT" \ + --field comments[][path]="Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift" \ + --field comments[][line]=274 \ + --field comments[][body]="**Potential Race Condition**: canAddWriters is computed using participants array (line 274), but participants is updated asynchronously in startJoiningTask() which runs in parallel with startParticipantTask()." +``` + +You can add multiple `--field comments[][...]` entries in a single command for multiple inline comments. + +### 3. Final Summary Comment +Always post a summary at the end: +```bash +gh pr comment ${PR_NUMBER} --body "Review complete - see inline comments for details" +``` + +## CRITICAL: Post Your Review + +**YOU MUST POST YOUR REVIEW TO THE PR** - analysis alone is not sufficient. + +After completing your review analysis: + +1. **For reviews with inline comments**: Post inline comments first using the strategies above, then post a final summary +2. **For reviews without inline comments**: Post your full review text as a single PR comment + +**Command**: +```bash +gh pr comment ${PR_NUMBER} --repo ${REPO} --body "YOUR_REVIEW_TEXT_HERE" +``` + +**Example** (clean approval): +```bash +gh pr comment ${PR_NUMBER} --repo ${REPO} --body "✅ **Approved** - No issues found" +``` + +**Example** (review with issues): +```bash +gh pr comment ${PR_NUMBER} --repo ${REPO} --body "## Bugs/Issues + +**SpaceHubToolbar.swift:109** +The \`attentionDotView\` overlay positioning is incorrect... + +--- + +âš ī¸ **Minor Issues** - Fix overlay positioning" +``` + +**Important**: +- Use single quotes to wrap multi-line review text if needed +- Escape special characters appropriately for bash +- Always include the status emoji summary at the end (as defined in shared guidelines) +- The workflow provides ${PR_NUMBER} and ${REPO} variables + diff --git a/.github/workflows/pr_tests.yml b/.github/workflows/pr_tests.yml index 64710fd02a..dd464c4fce 100644 --- a/.github/workflows/pr_tests.yml +++ b/.github/workflows/pr_tests.yml @@ -32,7 +32,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci diff --git a/.github/workflows/release_build.yaml b/.github/workflows/release_build.yaml index d9565a5574..c2274e1ca2 100644 --- a/.github/workflows/release_build.yaml +++ b/.github/workflows/release_build.yaml @@ -6,17 +6,6 @@ permissions: on: # Allows you to run this workflow manually from the Actions tab workflow_dispatch: - inputs: - build_anytype_app: - description: "Build Anytype Release" - required: false - default: "false" - type: boolean - build_any_app: - description: "Build Any App Release" - required: false - default: "false" - type: boolean concurrency: group: ${{ github.workflow }} @@ -46,7 +35,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci @@ -65,7 +54,6 @@ jobs: FASTLANE_XCODE_LIST_TIMEOUT: 900 - name: Build and upload Anytype to Testflight - if: ${{ inputs.build_anytype_app == true }} run: | export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 @@ -87,34 +75,6 @@ jobs: if: ${{ inputs.build_anytype_app == true }} run: echo "${{ env.FASTLANE_GITHUB_SUMMARY }}" >> $GITHUB_STEP_SUMMARY - - name: Build and upload Any App to Testflight - if: ${{ inputs.build_any_app == true }} - run: | - export LC_ALL=en_US.UTF-8 - export LANG=en_US.UTF-8 - bundle exec fastlane release_anyapp - env: - MATCH_GIT_PRIVATE_KEY: ${{ secrets.SSH_KEY_FASTLANE_MATCH }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - APP_STORE_CONNECT_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ID }} - APP_STORE_CONNECT_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_ISSUER_ID }} - APP_STORE_CONNECT_KEY_CONTENT: ${{ secrets.APP_STORE_CONNECT_API_PRIVATE_KEY }} - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - LINEAR_TOKEN: ${{ secrets.LINEAR_TOKEN }} - AMPLITUDE_API_KEY: ${{ secrets.AMPLITUDE_API_KEY }} - OPENAI_TOKEN: ${{ secrets.OPENAI_TOKEN }} - AI_ENDPOINT: ${{ secrets.AI_ENDPOINT }} - AI_MODEL: ${{ secrets.AI_MODEL }} - ANY_APP_MEMBERSHIP_TIER_SECRET: ${{ secrets.ANY_APP_MEMBERSHIP_TIER_SECRET }} - JOIN_STREAM_URL: ${{ secrets.JOIN_STREAM_URL }} - FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 900 - FASTLANE_XCODE_LIST_TIMEOUT: 900 - - - name: Summary Any App - if: ${{ inputs.build_any_app == true }} - run: echo "${{ env.FASTLANE_GITHUB_SUMMARY }}" >> $GITHUB_STEP_SUMMARY - - name: Send Slack Notification if: always() uses: ./.github/actions/send-slack-message diff --git a/.github/workflows/test_fastlane_build.yaml b/.github/workflows/test_fastlane_build.yaml index cd7d1ac8af..d9a7e4182f 100644 --- a/.github/workflows/test_fastlane_build.yaml +++ b/.github/workflows/test_fastlane_build.yaml @@ -8,7 +8,7 @@ on: jobs: main: - runs-on: macos-15 + runs-on: macos-26 steps: - uses: actions/checkout@v4 @@ -28,7 +28,7 @@ jobs: - uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci diff --git a/.github/workflows/update_cache.yaml b/.github/workflows/update_cache.yaml index 5c449cd1ef..f21b4d1e75 100644 --- a/.github/workflows/update_cache.yaml +++ b/.github/workflows/update_cache.yaml @@ -8,7 +8,7 @@ on: jobs: main: name: Update build cache - runs-on: macos-15 + runs-on: macos-26 steps: - name: Checkout @@ -28,7 +28,7 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' - name: Download Middleware run: make setup-middle-ci diff --git a/.github/workflows/update_middleware.yaml b/.github/workflows/update_middleware.yaml index 39e6490f44..ddafc2d8d2 100644 --- a/.github/workflows/update_middleware.yaml +++ b/.github/workflows/update_middleware.yaml @@ -1,5 +1,18 @@ name: Update middleware version +# This workflow automates the process of updating the middleware version: +# 1. Checks if the version is already up-to-date +# 2. Updates the version in Libraryfile +# 3. Downloads new middleware binaries and regenerates files +# 4. Runs unit tests to ensure compatibility +# 5. Creates a PR with the changes +# 6. Closes the associated Linear issue (if task_name is provided) +# +# Required secrets: +# - SERVICE_USER_GITHUB_TOKEN: GitHub token for creating PRs and pushing changes +# - MIDDLEWARE_TOKEN: Token for accessing middleware repository +# - LINEAR_TOKEN: Linear API token for closing issues (required when task_name is provided) + on: workflow_dispatch: inputs: @@ -25,9 +38,11 @@ permissions: pull-requests: write jobs: + # First job: Check if the middleware version is already up-to-date + # This prevents unnecessary work if the version hasn't changed check-version: name: Check current middleware version - runs-on: macos-15 + runs-on: macos-26 outputs: same: ${{ steps.chk.outputs.same }} steps: @@ -38,12 +53,15 @@ jobs: id: chk shell: bash run: | + # Read the MIDDLE_VERSION from Libraryfile (contains current middleware version) set -a source Libraryfile || true set +a CURR="${MIDDLE_VERSION:-}" echo "Current version: ${CURR}" echo "Target version: ${{ inputs.middle_version }}" + + # Compare current version with target version if [ "$CURR" = "${{ inputs.middle_version }}" ]; then echo "same=true" >> "$GITHUB_OUTPUT" echo "Version already up-to-date. Workflow will finish successfully without updates." @@ -52,15 +70,18 @@ jobs: echo "Version differs. Proceeding with updateâ€Ļ" fi + # Second job: Perform the actual middleware update + # Only runs if the version check shows the version needs updating update: name: Update middleware version - runs-on: macos-15 + runs-on: macos-26 needs: check-version if: ${{ needs.check-version.outputs.same != 'true' }} steps: - name: Checkout uses: actions/checkout@v3 + # Restore cached build artifacts to speed up the process - name: Restore cache for local build folder uses: actions/cache/restore@v4 with: @@ -68,10 +89,11 @@ jobs: key: build-local-tools-${{ github.sha }} restore-keys: | build-local-tools- - + - name: Prepare deps uses: ./.github/actions/prepare-deps + # Restore Xcode derived data cache to speed up builds - name: Xcode Cache uses: irgaly/xcode-cache@v1 with: @@ -84,56 +106,137 @@ jobs: - name: Setup Xcode uses: maxim-lobanov/setup-xcode@v1.6.0 with: - xcode-version: '26.0' + xcode-version: '26.1' + # Install required development tools (e.g., SwiftGen, Sourcery) - name: Setup tools run: make setup-env env: GITHUB_TOKEN: ${{ secrets.SERVICE_USER_GITHUB_TOKEN }} - + + # Update the MIDDLE_VERSION value in Libraryfile - name: Update Middleware Version run: make set-middle-version v=${{ inputs.middle_version }} + # Download the new middleware binaries and regenerate protobuf files - name: Download Middleware and Generate Files run: make setup-middle env: MIDDLEWARE_TOKEN: ${{ secrets.MIDDLEWARE_TOKEN }} + # Configure git user for commits - name: Update git config uses: ./.github/actions/update-git-config - + + # Create a new branch and commit the changes + # Branch name format: IOS-123-update-middleware-1.2.3 or update-middleware-1.2.3 - name: Create Commit id: commit run: | BRANCH_NAME="${{ inputs.task_name != '' && format('{0}-update-middleware-{1}', inputs.task_name, inputs.middle_version) || format('update-middleware-{0}', inputs.middle_version) }}" COMMIT_MESSAGE="${{ inputs.task_name != '' && format('{0} Automation: Update middleware to {1}', inputs.task_name, inputs.middle_version) || format('Automation: Update middleware to {0}', inputs.middle_version) }}" - - # Delete local branch if exists + + # Clean up any existing branch with the same name git branch -D $BRANCH_NAME || true - # Delete remote branch if exists git push origin --delete $BRANCH_NAME || true - # Create new branch + + # Create new branch and commit all changes git checkout -b $BRANCH_NAME git add . git commit -m "$COMMIT_MESSAGE" --no-verify - + + # Export branch name and commit message for later steps echo "branch_name=$BRANCH_NAME" >> $GITHUB_OUTPUT echo "commit_message=$COMMIT_MESSAGE" >> $GITHUB_OUTPUT env: GITHUB_TOKEN: ${{ secrets.SERVICE_USER_GITHUB_TOKEN }} + # Verify that the middleware update doesn't break existing tests - name: Run unit tests run: bundle exec fastlane tests skip_notify:true env: FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT: 900 FASTLANE_XCODE_LIST_TIMEOUT: 900 - - - name: Create and Merge PR + + # Push the branch and create a PR + - name: Create PR run: | git push origin ${{ steps.commit.outputs.branch_name }} --no-verify - + PR_BODY="This PR updates middleware to version ${{ inputs.middle_version }}" gh pr create --title "${{ steps.commit.outputs.commit_message }}" --body "$PR_BODY" --base ${{ github.ref_name }} env: GITHUB_TOKEN: ${{ secrets.SERVICE_USER_GITHUB_TOKEN }} - \ No newline at end of file + + # Close the Linear issue by moving it to "Done" state + # Only runs if a task_name was provided (e.g., IOS-123) + - name: Close Linear Issue + if: ${{ inputs.task_name != '' }} + run: | + ISSUE_ID="${{ inputs.task_name }}" + + # Step 1: Query Linear API to get the issue and its team's workflow states + # We need to find the "Done" state ID for this team + # Note: Using 'issues' query with identifier filter to handle human-readable IDs like "IOS-5375" + ISSUE_QUERY='query($identifier: String!) { + issues(filter: { identifier: { eq: $identifier } }) { + nodes { + id + team { + states { + nodes { + id + name + type + } + } + } + } + } + }' + + # Make GraphQL request to get issue data + ISSUE_DATA=$(curl -s -X POST https://api.linear.app/graphql \ + -H "Authorization: ${{ secrets.LINEAR_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d "{\"query\":\"$ISSUE_QUERY\",\"variables\":{\"identifier\":\"$ISSUE_ID\"}}") + + # Step 2: Extract the issue UUID and the state ID for "Done" (type="completed") + # We need the UUID for the mutation, not the identifier + ISSUE_UUID=$(echo "$ISSUE_DATA" | jq -r '.data.issues.nodes[0].id') + + # Different teams may have different names for the Done state, but they all have type="completed" + DONE_STATE_ID=$(echo "$ISSUE_DATA" | jq -r '.data.issues.nodes[0].team.states.nodes[] | select(.type == "completed") | .id' | head -1) + + # Step 3: Verify we found the issue and Done state + if [ -z "$ISSUE_UUID" ] || [ "$ISSUE_UUID" = "null" ]; then + echo "Warning: Could not find issue $ISSUE_ID" + exit 0 + fi + + if [ -z "$DONE_STATE_ID" ]; then + echo "Warning: Could not find 'Done' state for issue $ISSUE_ID" + exit 0 + fi + + # Step 4: Update the issue to move it to Done state + UPDATE_MUTATION='mutation($issueId: String!, $stateId: String!) { + issueUpdate(id: $issueId, input: { stateId: $stateId }) { + success + issue { + id + state { + name + } + } + } + }' + + # Make GraphQL mutation request to update the issue using the UUID + UPDATE_RESULT=$(curl -s -X POST https://api.linear.app/graphql \ + -H "Authorization: ${{ secrets.LINEAR_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d "{\"query\":\"$UPDATE_MUTATION\",\"variables\":{\"issueId\":\"$ISSUE_UUID\",\"stateId\":\"$DONE_STATE_ID\"}}") + + echo "Linear issue $ISSUE_ID closed successfully" + echo "$UPDATE_RESULT" \ No newline at end of file diff --git a/.mcp.json b/.mcp.json index 9da3a08c1b..7522cb6394 100644 --- a/.mcp.json +++ b/.mcp.json @@ -11,6 +11,10 @@ "figma": { "type": "sse", "url": "http://127.0.0.1:3845/sse" + }, + "context7": { + "type": "http", + "url": "https://mcp.context7.com/mcp" } } } \ No newline at end of file diff --git a/AnyTypeTests/Services/SetContentViewDataBuilderTests.swift b/AnyTypeTests/Services/SetContentViewDataBuilderTests.swift new file mode 100644 index 0000000000..ebe4248915 --- /dev/null +++ b/AnyTypeTests/Services/SetContentViewDataBuilderTests.swift @@ -0,0 +1,232 @@ +import Testing +import Foundation +@testable import Anytype +import Services + +@Suite +struct SetContentViewDataBuilderTests { + + private let builder: SetContentViewDataBuilder + + init() { + self.builder = SetContentViewDataBuilder() + } + + @Test func testBuildChatPreview_EmptyPreviewsArray_ReturnsNil() { + let chatPreviewsDict: [String: ChatMessagePreview] = [:] + let objectId = "test-object-id" + + let result = builder.buildChatPreview( + objectId: objectId, + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result == nil) + } + + @Test func testBuildChatPreview_PreviewWithoutLastMessage_ReturnsNil() { + let preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + let chatPreviewsDict = ["chat1": preview] + + let result = builder.buildChatPreview( + objectId: "chat1", + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result == nil) + } + + @Test func testBuildChatPreview_NilSpaceView_UsesDefaultNotificationMode() { + let creator = Participant.mock(id: "user1", localName: "Test User") + let lastMessage = LastMessagePreview( + id: "msg1", + creator: creator, + text: "Test message", + createdAt: Date(), + modifiedAt: nil, + attachments: [], + orderId: "1" + ) + var preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + preview.lastMessage = lastMessage + let chatPreviewsDict = ["chat1": preview] + + let result = builder.buildChatPreview( + objectId: "chat1", + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result != nil) + #expect(result?.isMuted == false) + } + + @Test func testBuildChatPreview_AttachmentTruncation_LimitsTo3() { + let attachments = (0..<5).map { index in + ObjectDetails.mock(id: "attachment\(index)") + } + + let lastMessage = LastMessagePreview( + id: "msg1", + creator: nil, + text: "Test", + createdAt: Date(), + modifiedAt: nil, + attachments: attachments, + orderId: "1" + ) + var preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + preview.lastMessage = lastMessage + let chatPreviewsDict = ["chat1": preview] + + let result = builder.buildChatPreview( + objectId: "chat1", + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result?.attachments.count == 3) + #expect(result?.attachments[0].id == "attachment0") + #expect(result?.attachments[2].id == "attachment2") + } + + @Test func testBuildChatPreview_ValidPreview_BuildsCompleteModel() { + let creator = Participant.mock(id: "user1", localName: "John Doe") + let lastMessage = LastMessagePreview( + id: "msg1", + creator: creator, + text: "Hello World", + createdAt: Date(timeIntervalSince1970: 1700000000), + modifiedAt: nil, + attachments: [], + orderId: "1" + ) + var preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + preview.lastMessage = lastMessage + let chatPreviewsDict = ["chat1": preview] + + let result = builder.buildChatPreview( + objectId: "chat1", + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result != nil) + #expect(result?.creatorTitle == "John Doe") + #expect(result?.text == "Hello World") + #expect(result?.chatPreviewDate.isEmpty == false) + } + + @Test func testBuildChatPreview_CountersPropagation() { + let lastMessage = LastMessagePreview( + id: "msg1", + creator: nil, + text: "Test", + createdAt: Date(), + modifiedAt: nil, + attachments: [], + orderId: "1" + ) + var preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + preview.lastMessage = lastMessage + + var chatState = ChatState() + var messagesState = ChatState.UnreadState() + messagesState.counter = 5 + chatState.messages = messagesState + + var mentionsState = ChatState.UnreadState() + mentionsState.counter = 2 + chatState.mentions = mentionsState + + preview.state = chatState + let chatPreviewsDict = ["chat1": preview] + + let result = builder.buildChatPreview( + objectId: "chat1", + spaceView: nil, + chatPreviewsDict: chatPreviewsDict + ) + + #expect(result?.unreadCounter == 5) + #expect(result?.mentionCounter == 2) + } + + @Test func testDictionaryConversion_EmptyArray_EmptyDictionary() { + let chatPreviews: [ChatMessagePreview] = [] + let dict = Dictionary(uniqueKeysWithValues: chatPreviews.map { ($0.chatId, $0) }) + + #expect(dict.isEmpty) + } + + @Test func testDictionaryConversion_SingleItem_SingleEntry() { + let preview = ChatMessagePreview(spaceId: "space1", chatId: "chat1") + let chatPreviews = [preview] + let dict = Dictionary(uniqueKeysWithValues: chatPreviews.map { ($0.chatId, $0) }) + + #expect(dict.count == 1) + #expect(dict["chat1"] != nil) + } + + @Test func testDictionaryConversion_MultipleUniqueItems() { + let previews = (0..<10).map { index in + ChatMessagePreview(spaceId: "space1", chatId: "chat\(index)") + } + let dict = Dictionary(uniqueKeysWithValues: previews.map { ($0.chatId, $0) }) + + #expect(dict.count == 10) + for index in 0..<10 { + #expect(dict["chat\(index)"] != nil) + } + } + + @Test func testDictionaryLookup_PerformanceImpact() { + let previews = (0..<100).map { index in + ChatMessagePreview(spaceId: "space1", chatId: "chat\(index)") + } + + let dict = Dictionary(uniqueKeysWithValues: previews.map { ($0.chatId, $0) }) + + let targetId = "chat50" + let result = dict[targetId] + + #expect(result != nil) + #expect(result?.chatId == targetId) + } +} + +extension ObjectDetails { + static func mock(id: String) -> ObjectDetails { + ObjectDetails(id: id, values: [:]) + } +} + +extension Participant { + static func mock( + id: String, + localName: String = "", + globalName: String = "", + icon: ObjectIcon? = nil, + status: ParticipantStatus = .active, + permission: ParticipantPermissions = .reader, + identity: String = "", + identityProfileLink: String = "", + spaceId: String = "", + type: String = "" + ) -> Participant { + Participant( + id: id, + localName: localName, + globalName: globalName, + icon: icon, + status: status, + permission: permission, + identity: identity, + identityProfileLink: identityProfileLink, + spaceId: spaceId, + type: type + ) + } +} diff --git a/Anytype.xcodeproj/project.pbxproj b/Anytype.xcodeproj/project.pbxproj index 9541dcb570..bb338fd2cb 100644 --- a/Anytype.xcodeproj/project.pbxproj +++ b/Anytype.xcodeproj/project.pbxproj @@ -190,7 +190,6 @@ 2AC434932B7A00FA006166BF /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/InfoPlist.strings; sourceTree = ""; }; 2E30580D2D81DF7E00BF4F25 /* AnytypeNotificationServiceExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = AnytypeNotificationServiceExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; }; 2E5A222B2DAD9477009134B9 /* AnytypeDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = AnytypeDebug.entitlements; sourceTree = ""; }; - 2E5A222C2DAD9483009134B9 /* AnytypeRelease-AnyApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "AnytypeRelease-AnyApp.entitlements"; sourceTree = ""; }; 2E9421FE2C19DFCB00AD05C2 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/InfoPlist.strings; sourceTree = ""; }; 2E9422032C19E15600AD05C2 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/InfoPlist.strings"; sourceTree = ""; }; 3D372A2D2CB56E1A00762DA9 /* be */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = be; path = be.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -234,7 +233,6 @@ isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( /Localized/LaunchScreen.storyboard, - "GoogleServices/GoogleService-Info-AnyApp-Release.plist", "GoogleServices/GoogleService-Info-Anytype-Dev.plist", "GoogleServices/GoogleService-Info-Anytype-Release.plist", ); @@ -387,7 +385,6 @@ 0303ECFD22D8EDAA005C552B /* Anytype */ = { isa = PBXGroup; children = ( - 2E5A222C2DAD9483009134B9 /* AnytypeRelease-AnyApp.entitlements */, 2E5A222B2DAD9477009134B9 /* AnytypeDebug.entitlements */, 86D7255F2A94EDB0008DF702 /* Anytype.entitlements */, 3D69B4E82CAEA9CB003F5A91 /* Sources */, @@ -1052,7 +1049,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1095,7 +1092,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1122,7 +1119,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1147,7 +1144,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1263,7 +1260,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev; PRODUCT_NAME = "$(TARGET_NAME) Dev"; @@ -1290,7 +1287,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1329,7 +1326,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.AnytypeNotificationExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1403,7 +1400,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.AnytypeNotificationExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1417,82 +1414,6 @@ }; name = "Release-Anytype"; }; - 2E3058172D81DF7F00BF4F25 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "AnytypeNotificationServiceExtension/AnytypeNotificationServiceExtensionRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = J3NXTX3T5S; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - 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; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeNotificationServiceExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2025 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.AnytypeNotificationExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.any.app.AnytypeNotificationExtension"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Release-AnyApp"; - }; 2E3058182D81DF7F00BF4F25 /* Release-Nightly */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1555,7 +1476,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.AnytypeNotificationExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1675,7 +1596,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; OTHER_LDFLAGS = "-ObjC"; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -1701,7 +1622,7 @@ "@executable_path/Frameworks", "@loader_path/Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1733,7 +1654,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.homewidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match Development io.anytype.app.homewidget"; @@ -1764,7 +1685,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.AnytypeShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1838,7 +1759,7 @@ "@executable_path/../../Frameworks", ); LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.AnytypeNotificationExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -1852,493 +1773,6 @@ }; name = "Debug-Anytype"; }; - 745858912DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMPILATION_CONDITION = DEBUG; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - 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 = 17.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=100 -Xfrontend -warn-long-function-bodies=100"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_COMPILATION_MODE = singlefile; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_STRICT_CONCURRENCY = complete; - SWIFT_UPCOMING_FEATURE_CONCISE_MAGIC_FILE = YES; - SWIFT_UPCOMING_FEATURE_DEPRECATE_APPLICATION_MAIN = YES; - SWIFT_UPCOMING_FEATURE_DISABLE_OUTWARD_ACTOR_ISOLATION = YES; - SWIFT_UPCOMING_FEATURE_DYNAMIC_ACTOR_ISOLATION = NO; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_UPCOMING_FEATURE_FORWARD_TRAILING_CLOSURES = YES; - SWIFT_UPCOMING_FEATURE_GLOBAL_ACTOR_ISOLATED_TYPES_USABILITY = YES; - SWIFT_UPCOMING_FEATURE_GLOBAL_CONCURRENCY = YES; - SWIFT_UPCOMING_FEATURE_IMPLICIT_OPEN_EXISTENTIALS = YES; - SWIFT_UPCOMING_FEATURE_IMPORT_OBJC_FORWARD_DECLS = YES; - SWIFT_UPCOMING_FEATURE_INFER_SENDABLE_FROM_CAPTURES = YES; - SWIFT_UPCOMING_FEATURE_ISOLATED_DEFAULT_VALUES = YES; - SWIFT_UPCOMING_FEATURE_NONFROZEN_ENUM_EXHAUSTIVITY = YES; - SWIFT_UPCOMING_FEATURE_REGION_BASED_ISOLATION = YES; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = NO; - }; - name = "Debug-AnyApp"; - }; - 745858922DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AnyAppIcon; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - BUILD_APP_URL_SCHEME = "prod-anyapp"; - BUNDLE_NAME = Any; - CODE_SIGN_ENTITLEMENTS = "Anytype/AnytypeRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_ASSET_PATHS = "Anytype/Resources/Preview\\ Content"; - DEVELOPMENT_TEAM = J3NXTX3T5S; - ENABLE_BITCODE = NO; - ENABLE_PREVIEWS = YES; - ENABLE_TESTING_SEARCH_PATHS = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - "$(PROJECT_DIR)/Dependencies/Middleware", - ); - GOOGLE_SERVICE_INFO_PLIST = "$(SRCROOT)/$(PROJECT_NAME)/Supporting files/GoogleServices/GoogleService-Info-AnyApp-Release.plist"; - HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "Anytype/Supporting files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 0.41.2; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app; - PRODUCT_NAME = Any; - PROVISIONING_PROFILE_SPECIFIER = "match Development org.any.app"; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_USE_INTEGRATED_DRIVER = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Debug-AnyApp"; - }; - 745858932DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = AnytypeTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Anytype.app/Anytype"; - }; - name = "Debug-AnyApp"; - }; - 745858942DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_TEAM = J3NXTX3T5S; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeWidget/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeWidget; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2022 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.homewidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "match Development org.any.app.homewidget"; - SKIP_INSTALL = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-AnyApp"; - }; - 745858952DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CODE_SIGN_ENTITLEMENTS = "AnytypeShareExtension/AnytypeShareExtensionRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_TEAM = J3NXTX3T5S; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = J3NXTX3T5S; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeShareExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeShareExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2023 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.AnytypeShareExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development org.any.app.AnytypeShareExtension"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Debug-AnyApp"; - }; - 745858962DD73A5C00895687 /* Debug-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "AnytypeNotificationServiceExtension/AnytypeNotificationServiceExtensionRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Developer"; - CODE_SIGN_STYLE = Manual; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 0; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DEVELOPMENT_TEAM = J3NXTX3T5S; - "DEVELOPMENT_TEAM[sdk=iphoneos*]" = J3NXTX3T5S; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_USER_SCRIPT_SANDBOXING = YES; - GCC_C_LANGUAGE_STANDARD = gnu17; - 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; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeNotificationServiceExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeNotificationServiceExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2025 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - LOCALIZATION_PREFERS_STRING_CATALOGS = YES; - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.AnytypeNotificationExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match Development org.any.app.AnytypeNotificationExtension"; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = "Debug-AnyApp"; - }; - 74F7F7E72D37BC1400F6C566 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES; - 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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMPILATION_CONDITION = RELEASE_ANYAPP; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_BITCODE = NO; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - 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 = 17.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - OTHER_SWIFT_FLAGS = "-Xfrontend -warn-long-expression-type-checking=100 -Xfrontend -warn-long-function-bodies=100"; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = RELEASE_ANYAPP; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - SWIFT_STRICT_CONCURRENCY = complete; - SWIFT_UPCOMING_FEATURE_CONCISE_MAGIC_FILE = YES; - SWIFT_UPCOMING_FEATURE_DEPRECATE_APPLICATION_MAIN = YES; - SWIFT_UPCOMING_FEATURE_DISABLE_OUTWARD_ACTOR_ISOLATION = YES; - SWIFT_UPCOMING_FEATURE_DYNAMIC_ACTOR_ISOLATION = NO; - SWIFT_UPCOMING_FEATURE_EXISTENTIAL_ANY = YES; - SWIFT_UPCOMING_FEATURE_FORWARD_TRAILING_CLOSURES = YES; - SWIFT_UPCOMING_FEATURE_GLOBAL_ACTOR_ISOLATED_TYPES_USABILITY = YES; - SWIFT_UPCOMING_FEATURE_GLOBAL_CONCURRENCY = YES; - SWIFT_UPCOMING_FEATURE_IMPLICIT_OPEN_EXISTENTIALS = YES; - SWIFT_UPCOMING_FEATURE_IMPORT_OBJC_FORWARD_DECLS = YES; - SWIFT_UPCOMING_FEATURE_INFER_SENDABLE_FROM_CAPTURES = YES; - SWIFT_UPCOMING_FEATURE_ISOLATED_DEFAULT_VALUES = YES; - SWIFT_UPCOMING_FEATURE_NONFROZEN_ENUM_EXHAUSTIVITY = YES; - SWIFT_UPCOMING_FEATURE_REGION_BASED_ISOLATION = YES; - SWIFT_VERSION = 5.0; - VALIDATE_PRODUCT = YES; - }; - name = "Release-AnyApp"; - }; - 74F7F7E82D37BC1400F6C566 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AnyAppIcon; - ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; - BUILD_APP_URL_SCHEME = "prod-anyapp"; - BUNDLE_NAME = Any; - CODE_SIGN_ENTITLEMENTS = "Anytype/AnytypeRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_ASSET_PATHS = "Anytype/Resources/Preview\\ Content"; - DEVELOPMENT_TEAM = J3NXTX3T5S; - ENABLE_BITCODE = NO; - ENABLE_PREVIEWS = YES; - ENABLE_TESTING_SEARCH_PATHS = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - "$(PROJECT_DIR)/Dependencies/Middleware", - ); - GOOGLE_SERVICE_INFO_PLIST = "$(SRCROOT)/$(PROJECT_NAME)/Supporting files/GoogleServices/GoogleService-Info-AnyApp-Release.plist"; - HEADER_SEARCH_PATHS = "$(inherited)"; - INFOPLIST_FILE = "Anytype/Supporting files/Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 0.41.2; - OTHER_LDFLAGS = "-ObjC"; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app; - PRODUCT_NAME = Any; - PROVISIONING_PROFILE_SPECIFIER = "match AppStore org.any.app"; - SENTRY_ENV = production; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_USE_INTEGRATED_DRIVER = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = "Release-AnyApp"; - }; - 74F7F7E92D37BC1400F6C566 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - BUNDLE_LOADER = "$(TEST_HOST)"; - CODE_SIGN_STYLE = Manual; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = AnytypeTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = com.AnytypeTests; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*]" = ""; - SUPPORTS_MACCATALYST = NO; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - TARGETED_DEVICE_FAMILY = "1,2"; - TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Anytype.app/Anytype"; - }; - name = "Release-AnyApp"; - }; - 74F7F7EA2D37BC1400F6C566 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - ASSETCATALOG_COMPILER_WIDGET_BACKGROUND_COLOR_NAME = WidgetBackground; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_TEAM = J3NXTX3T5S; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeWidget/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeWidget; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2022 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.homewidget; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = "match AppStore org.any.app.homewidget"; - SKIP_INSTALL = YES; - SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Release-AnyApp"; - }; - 74F7F7EB2D37BC1400F6C566 /* Release-AnyApp */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CODE_SIGN_ENTITLEMENTS = "AnytypeShareExtension/AnytypeShareExtensionRelease-AnyApp.entitlements"; - CODE_SIGN_IDENTITY = "iPhone Distribution"; - CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 0; - DEVELOPMENT_TEAM = J3NXTX3T5S; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = AnytypeShareExtension/Info.plist; - INFOPLIST_KEY_CFBundleDisplayName = AnytypeShareExtension; - INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright Š 2023 Anytype. All rights reserved."; - IPHONEOS_DEPLOYMENT_TARGET = 17.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@executable_path/../../Frameworks", - ); - MARKETING_VERSION = 0.41.2; - PRODUCT_BUNDLE_IDENTIFIER = org.any.app.AnytypeShareExtension; - PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE_SPECIFIER = ""; - "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore org.any.app.AnytypeShareExtension"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = "Release-AnyApp"; - }; 862D559B2A8F78340018103F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -2358,7 +1792,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.AnytypeShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match Development io.anytype.app.dev.AnytypeShareExtension"; @@ -2387,7 +1821,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.AnytypeShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2417,7 +1851,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.AnytypeShareExtension; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -2448,7 +1882,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.homewidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match Development io.anytype.app.dev.homewidget"; @@ -2479,7 +1913,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.homewidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore io.anytype.app.homewidget"; @@ -2510,7 +1944,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 0.41.2; + MARKETING_VERSION = 0.42.0; PRODUCT_BUNDLE_IDENTIFIER = io.anytype.app.dev.homewidget; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = "match AppStore io.anytype.app.dev.homewidget"; @@ -2530,8 +1964,6 @@ 0303ED0D22D8EDAD005C552B /* Debug */, 0303ED0E22D8EDAD005C552B /* Release-Anytype */, 7458588B2DD73A4F00895687 /* Debug-Anytype */, - 74F7F7E72D37BC1400F6C566 /* Release-AnyApp */, - 745858912DD73A5C00895687 /* Debug-AnyApp */, 1267458B2696FEC1002132F3 /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; @@ -2543,8 +1975,6 @@ 0303ED1022D8EDAD005C552B /* Debug */, 0303ED1122D8EDAD005C552B /* Release-Anytype */, 7458588C2DD73A4F00895687 /* Debug-Anytype */, - 74F7F7E82D37BC1400F6C566 /* Release-AnyApp */, - 745858922DD73A5C00895687 /* Debug-AnyApp */, 1267458C2696FEC1002132F3 /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; @@ -2556,8 +1986,6 @@ 03C5C54822DFD90C00DD91DE /* Debug */, 03C5C54922DFD90C00DD91DE /* Release-Anytype */, 7458588D2DD73A4F00895687 /* Debug-Anytype */, - 74F7F7E92D37BC1400F6C566 /* Release-AnyApp */, - 745858932DD73A5C00895687 /* Debug-AnyApp */, 1267458D2696FEC1002132F3 /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; @@ -2569,8 +1997,6 @@ 2E3058152D81DF7F00BF4F25 /* Debug */, 2E3058162D81DF7F00BF4F25 /* Release-Anytype */, 745858902DD73A4F00895687 /* Debug-Anytype */, - 2E3058172D81DF7F00BF4F25 /* Release-AnyApp */, - 745858962DD73A5C00895687 /* Debug-AnyApp */, 2E3058182D81DF7F00BF4F25 /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; @@ -2582,8 +2008,6 @@ 862D559B2A8F78340018103F /* Debug */, 862D559C2A8F78340018103F /* Release-Anytype */, 7458588F2DD73A4F00895687 /* Debug-Anytype */, - 74F7F7EB2D37BC1400F6C566 /* Release-AnyApp */, - 745858952DD73A5C00895687 /* Debug-AnyApp */, 862D559D2A8F78340018103F /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; @@ -2595,8 +2019,6 @@ C960DFBB28D88618002898AE /* Debug */, C960DFBC28D88618002898AE /* Release-Anytype */, 7458588E2DD73A4F00895687 /* Debug-Anytype */, - 74F7F7EA2D37BC1400F6C566 /* Release-AnyApp */, - 745858942DD73A5C00895687 /* Debug-AnyApp */, C960DFBD28D88618002898AE /* Release-Nightly */, ); defaultConfigurationIsVisible = 0; diff --git a/Anytype/AnytypeRelease-AnyApp.entitlements b/Anytype/AnytypeRelease-AnyApp.entitlements deleted file mode 100644 index 578b2f19b6..0000000000 --- a/Anytype/AnytypeRelease-AnyApp.entitlements +++ /dev/null @@ -1,21 +0,0 @@ - - - - - aps-environment - development - com.apple.developer.associated-domains - - applinks:invite-stage.any.coop - applinks:invite.any.coop - - com.apple.developer.networking.multicast - - com.apple.developer.usernotifications.communication - - com.apple.security.application-groups - - group.org.any.app - - - diff --git a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Contents.json b/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Contents.json deleted file mode 100644 index 36607191b5..0000000000 --- a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Contents.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "images" : [ - { - "filename" : "Icon-Any-1024.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "dark" - } - ], - "filename" : "Dark-Icon-Any-1024.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - }, - { - "appearances" : [ - { - "appearance" : "luminosity", - "value" : "tinted" - } - ], - "filename" : "Tinted-Icon-Any-1024.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Dark-Icon-Any-1024.png b/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Dark-Icon-Any-1024.png deleted file mode 100644 index ea59b70b57..0000000000 Binary files a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Dark-Icon-Any-1024.png and /dev/null differ diff --git a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Icon-Any-1024.png b/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Icon-Any-1024.png deleted file mode 100644 index 56caba4f84..0000000000 Binary files a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Icon-Any-1024.png and /dev/null differ diff --git a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Tinted-Icon-Any-1024.png b/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Tinted-Icon-Any-1024.png deleted file mode 100644 index fbbaa41eb1..0000000000 Binary files a/Anytype/Resources/SystemAssets.xcassets/AnyAppIcon.appiconset/Tinted-Icon-Any-1024.png and /dev/null differ diff --git a/Anytype/Sources/Analytics/AnalyticsConstants.swift b/Anytype/Sources/Analytics/AnalyticsConstants.swift index 788a00deaf..7dc0a02950 100644 --- a/Anytype/Sources/Analytics/AnalyticsConstants.swift +++ b/Anytype/Sources/Analytics/AnalyticsConstants.swift @@ -402,6 +402,11 @@ enum EditTypeRoute: String { case type = "Type" } +enum ScreenCreateTypeRoute: String { + case screenObjectTypes = "ScreenObjectTypes" + case screenWidget = "ScreenWidget" +} + enum OpenObjectByLinkType: String { case object = "Object" case invite = "Invite" diff --git a/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics+Events.swift b/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics+Events.swift index 2e0d119ea2..4ab9aab0c8 100644 --- a/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics+Events.swift +++ b/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics+Events.swift @@ -156,10 +156,9 @@ extension AnytypeAnalytics { ) } - func logChangeObjectType(_ type: AnalyticsObjectType, spaceId: String, route: ChangeObjectTypeRoute? = nil) { + func logChangeObjectType(_ type: AnalyticsObjectType, route: ChangeObjectTypeRoute? = nil) { logEvent( "ChangeObjectType", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.objectType: type.analyticsId, AnalyticsEventsPropertiesKey.route: route?.rawValue @@ -241,10 +240,9 @@ extension AnytypeAnalytics { logEvent("DeleteBlock") } - func logUploadMedia(type: FileContentType, spaceId: String, route: UploadMediaRoute) { + func logUploadMedia(type: FileContentType, route: UploadMediaRoute) { logEvent( "UploadMedia", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.type: type.rawValue, AnalyticsEventsPropertiesKey.route: route.rawValue @@ -252,10 +250,9 @@ extension AnytypeAnalytics { ) } - func logDownloadMedia(type: FileContentType, spaceId: String) { + func logDownloadMedia(type: FileContentType) { logEvent( "DownloadMedia", - spaceId: spaceId, withEventProperties: [AnalyticsEventsPropertiesKey.type: type.rawValue] ) } @@ -270,7 +267,6 @@ extension AnytypeAnalytics { isNew: Bool, type: AnalyticsEventsRelationType, key: AnalyticsRelationKey, - spaceId: String, route: AnalyticsEventsRouteKind? = nil ) { let properties = [ @@ -282,7 +278,6 @@ extension AnytypeAnalytics { logEvent( isNew ? "CreateRelation" : "AddExistingRelation", - spaceId: spaceId, withEventProperties: properties ) } @@ -291,12 +286,10 @@ extension AnytypeAnalytics { isEmpty: Bool, format: PropertyFormat, type: AnalyticsEventsRelationType, - key: AnalyticsRelationKey, - spaceId: String + key: AnalyticsRelationKey ) { logEvent( isEmpty ? "DeleteRelationValue" : "ChangeRelationValue", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.type: type.rawValue, AnalyticsEventsPropertiesKey.format: format.analyticsName, @@ -317,18 +310,18 @@ extension AnytypeAnalytics { logEvent("CreateObject", spaceId: spaceId, withEventProperties: properties) } - func logCreateObjectType(spaceId: String) { + func logCreateObjectType(route: ScreenCreateTypeRoute) { let properties = [ AnalyticsEventsPropertiesKey.objectType: "_otobjectType", - AnalyticsEventsPropertiesKey.format: "Page" + AnalyticsEventsPropertiesKey.format: "Page", + AnalyticsEventsPropertiesKey.route: route.rawValue ] - logEvent("CreateObject", spaceId: spaceId, withEventProperties: properties) + logEvent("CreateObject", withEventProperties: properties) } - func logLinkToObject(type: AnalyticsEventsLinkToObjectType, spaceId: String) { + func logLinkToObject(type: AnalyticsEventsLinkToObjectType) { logEvent( "LinkToObject", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.linkType: type.rawValue ] @@ -336,10 +329,9 @@ extension AnytypeAnalytics { } // MARK: - Collection - func logScreenCollection(with type: String, spaceId: String) { + func logScreenCollection(with type: String) { logEvent( "ScreenCollection", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.embedType: AnalyticsEventsSetCollectionEmbedType.object, AnalyticsEventsPropertiesKey.type: type @@ -349,10 +341,9 @@ extension AnytypeAnalytics { // MARK: - Type - func logScreenType(objectType: AnalyticsObjectType?, spaceId: String) { + func logScreenType(objectType: AnalyticsObjectType?) { logEvent( "ScreenType", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.objectType: objectType?.analyticsId ?? "" ] @@ -389,10 +380,9 @@ extension AnytypeAnalytics { } // MARK: - Set - func logScreenSet(with type: String, spaceId: String) { + func logScreenSet(with type: String) { logEvent( "ScreenSet", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.embedType: AnalyticsEventsSetCollectionEmbedType.object, AnalyticsEventsPropertiesKey.type: type @@ -686,29 +676,26 @@ extension AnytypeAnalytics { logEvent("SettingsWallpaperSet") } - func logScreenSearch(spaceId: String, type: ScreenSearchType) { + func logScreenSearch(type: ScreenSearchType) { logEvent( "ScreenSearch", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.type: type.rawValue ]) } - func logSearchResult(spaceId: String, objectType: String? = nil) { + func logSearchResult(objectType: String? = nil) { logEvent( "SearchResult", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.objectType: objectType ].compactMapValues { $0 } ) } - func logSearchInput(spaceId: String, route: SearchInputRoute? = nil) { + func logSearchInput(route: SearchInputRoute? = nil) { logEvent( "SearchInput", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.route: route?.rawValue ].compactMapValues { $0 } @@ -749,10 +736,9 @@ extension AnytypeAnalytics { ) } - func logDuplicateObject(count: Int, objectType: AnalyticsObjectType, spaceId: String) { + func logDuplicateObject(count: Int, objectType: AnalyticsObjectType) { logEvent( "DuplicateObject", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.count: count, AnalyticsEventsPropertiesKey.objectType: objectType.analyticsId, @@ -760,12 +746,12 @@ extension AnytypeAnalytics { ) } - func logCopyBlock(spaceId: String, countBlocks: Int) { - logEvent("CopyBlock", spaceId: spaceId, withEventProperties: [AnalyticsEventsPropertiesKey.count: countBlocks]) + func logCopyBlock(countBlocks: Int) { + logEvent("CopyBlock", withEventProperties: [AnalyticsEventsPropertiesKey.count: countBlocks]) } - func logPasteBlock(spaceId: String, countBlocks: Int) { - logEvent("PasteBlock", spaceId: spaceId, withEventProperties: [AnalyticsEventsPropertiesKey.count: countBlocks]) + func logPasteBlock(countBlocks: Int) { + logEvent("PasteBlock", withEventProperties: [AnalyticsEventsPropertiesKey.count: countBlocks]) } func logSetObjectDescription() { @@ -930,10 +916,9 @@ extension AnytypeAnalytics { ) } - func logTemplateCreate(objectType: AnalyticsObjectType, spaceId: String) { + func logTemplateCreate(objectType: AnalyticsObjectType) { logEvent( "CreateTemplate", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.objectType: objectType.analyticsId ] @@ -970,10 +955,9 @@ extension AnytypeAnalytics { ) } - func logCreateLink(spaceId: String, objectType: AnalyticsObjectType, route: AnalyticsEventsRouteKind) { + func logCreateLink(objectType: AnalyticsObjectType, route: AnalyticsEventsRouteKind) { logEvent( "CreateLink", - spaceId: spaceId, withEventProperties: [ AnalyticsEventsPropertiesKey.objectType: objectType.analyticsId, AnalyticsEventsPropertiesKey.route: route.rawValue @@ -1070,6 +1054,7 @@ extension AnytypeAnalytics { func logGalleryInstall(name: String) { logEvent( "GalleryInstall", + addActiveSpaceInfo: false, withEventProperties: [AnalyticsEventsPropertiesKey.name: name] ) } @@ -1196,12 +1181,12 @@ extension AnytypeAnalytics { logEvent("ScreenSettingsSpaceMembers", withEventProperties: [AnalyticsEventsPropertiesKey.route: route.rawValue]) } - func logDuplicateBlock(spaceId: String) { - logEvent("DuplicateBlock", spaceId: spaceId) + func logDuplicateBlock() { + logEvent("DuplicateBlock") } - func logDeleteRelation(spaceId: String, format: PropertyFormat, key: AnalyticsRelationKey? = nil, route: DeleteRelationRoute) { - logEvent("DeleteRelation", spaceId: spaceId, withEventProperties: [ + func logDeleteRelation(format: PropertyFormat, key: AnalyticsRelationKey? = nil, route: DeleteRelationRoute) { + logEvent("DeleteRelation", withEventProperties: [ AnalyticsEventsPropertiesKey.relationKey: key?.value ?? "", AnalyticsEventsPropertiesKey.format: format.analyticsName, AnalyticsEventsPropertiesKey.route: route.rawValue @@ -1318,11 +1303,11 @@ extension AnytypeAnalytics { func logHistoryBack() { logEvent("HistoryBack") } - + func logScreenWidget() { logEvent("ScreenWidget") } - + func logScreenBin() { logEvent("ScreenBin") } @@ -1424,7 +1409,16 @@ extension AnytypeAnalytics { ] ) } - + + func logScreenCreateType(route: ScreenCreateTypeRoute) { + logEvent( + "ScreenCreateType", + withEventProperties: [ + AnalyticsEventsPropertiesKey.route: route.rawValue + ] + ) + } + func logOpenObjectByLink(type: OpenObjectByLinkType, route: OpenObjectByLinkRoute) { logEvent( "OpenObjectByLink", @@ -1764,4 +1758,8 @@ extension AnytypeAnalytics { AnalyticsEventsPropertiesKey.type: objectType.analyticsId ].compactMapValues { $0 }) } + + func logClickNavigationScreenHome() { + logEvent("ClickNavigationScreenHome") + } } diff --git a/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics.swift b/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics.swift index 2bbaec06da..0ef7e7714f 100644 --- a/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics.swift +++ b/Anytype/Sources/Analytics/AnytypeAnalytics/AnytypeAnalytics.swift @@ -28,6 +28,8 @@ final class AnytypeAnalytics: @unchecked Sendable { @Injected(\.participantSpacesStorage) private var participantSpacesStorage: any ParticipantSpacesStorageProtocol + @Injected(\.activeSpaceManager) + private var activeSpaceManager: any ActiveSpaceManagerProtocol private init() { userProperties[Keys.interfaceLang] = Locale.current.language.languageCode?.identifier @@ -99,10 +101,20 @@ final class AnytypeAnalytics: @unchecked Sendable { eventProperties[AnalyticsEventsPropertiesKey.uxType] = uxType } - logEvent(eventType, withEventProperties: eventProperties) + logRawEvent(eventType, withEventProperties: eventProperties) } - func logEvent(_ eventType: String, withEventProperties eventProperties: [String : Any] = [:]) { + func logEvent(_ eventType: String, addActiveSpaceInfo: Bool = true, withEventProperties eventProperties: [String : Any] = [:]) { + if addActiveSpaceInfo, let workspaceInfo = activeSpaceManager.workspaceInfo { + logEvent(eventType, spaceId: workspaceInfo.accountSpaceId, withEventProperties: eventProperties) + } else { + logRawEvent(eventType, withEventProperties: eventProperties) + } + } + + // MARK: - Private + + private func logRawEvent(_ eventType: String, withEventProperties eventProperties: [String : Any] = [:]) { let eventConfiguration = eventsConfiguration[eventType] if case .notInRow = eventConfiguration?.threshold, lastEvents == eventType { diff --git a/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorView.swift b/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorView.swift index 2414b99f62..356e9e9950 100644 --- a/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorView.swift +++ b/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorView.swift @@ -4,7 +4,7 @@ import AnytypeCore struct ApplicationCoordinatorView: View { - @StateObject private var model = ApplicationCoordinatorViewModel() + @State private var model = ApplicationCoordinatorViewModel() @Environment(\.dismissAllPresented) private var dismissAllPresented var body: some View { @@ -44,31 +44,14 @@ struct ApplicationCoordinatorView: View { switch model.applicationState { case .initial: InitialCoordinatorView() - .if(!FeatureFlags.brandNewAuthFlow) { - $0.overrideDefaultInterfaceStyle(.dark) - } case .auth: - if FeatureFlags.brandNewAuthFlow { - AuthCoordinatorView() - } else { - model.authView() - .overrideDefaultInterfaceStyle(.dark) - } + AuthCoordinatorView() case .login: LaunchView() - .if(!FeatureFlags.brandNewAuthFlow) { - $0.overrideDefaultInterfaceStyle(.dark) - } case .home: SpaceHubCoordinatorView() - .if(!FeatureFlags.brandNewAuthFlow) { - $0.overrideDefaultInterfaceStyle(nil) - } case .delete: - model.deleteAccount()? - .if(!FeatureFlags.brandNewAuthFlow) { - $0.overrideDefaultInterfaceStyle(nil) - } + model.deleteAccount() } } } diff --git a/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorViewModel.swift b/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorViewModel.swift index e23e4e64f2..75b51ca479 100644 --- a/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorViewModel.swift +++ b/Anytype/Sources/ApplicationLayer/AppCoordinator/ApplicationCoordinatorViewModel.swift @@ -4,51 +4,37 @@ import AnytypeCore import Services @MainActor -final class ApplicationCoordinatorViewModel: ObservableObject { +@Observable +final class ApplicationCoordinatorViewModel { - @Injected(\.authService) + @Injected(\.authService) @ObservationIgnored private var authService: any AuthServiceProtocol - @Injected(\.accountEventHandler) + @Injected(\.accountEventHandler) @ObservationIgnored private var accountEventHandler: any AccountEventHandlerProtocol - @Injected(\.encryptionKeyEventHandler) + @Injected(\.encryptionKeyEventHandler) @ObservationIgnored private var encryptionKeyEventHandler: any EncryptionKeyEventHandlerProtocol - @Injected(\.applicationStateService) + @Injected(\.applicationStateService) @ObservationIgnored private var applicationStateService: any ApplicationStateServiceProtocol - @Injected(\.accountManager) + @Injected(\.accountManager) @ObservationIgnored private var accountManager: any AccountManagerProtocol - @Injected(\.seedService) + @Injected(\.seedService) @ObservationIgnored private var seedService: any SeedServiceProtocol - @Injected(\.fileErrorEventHandler) + @Injected(\.fileErrorEventHandler) @ObservationIgnored private var fileErrorEventHandler: any FileErrorEventHandlerProtocol - @Injected(\.basicUserInfoStorage) + @Injected(\.basicUserInfoStorage) @ObservationIgnored private var basicUserInfoStorage: any BasicUserInfoStorageProtocol - @Injected(\.pushNotificationsPermissionService) + @Injected(\.pushNotificationsPermissionService) @ObservationIgnored private var pushNotificationsPermissionService: any PushNotificationsPermissionServiceProtocol - - private var authCoordinator: (any AuthCoordinatorProtocol)? + + @ObservationIgnored private var dismissAllPresented: DismissAllPresented? // MARK: - State - @Published var applicationState: ApplicationState = .initial - @Published var toastBarData: ToastBarData? - @Published var migrationData: MigrationModuleData? - @Published var selectAccountTaskId: String? - - // MARK: - Initializers - - func authView() -> AnyView { - if let authCoordinator { - return authCoordinator.startFlow() - } - - let coordinator = AuthCoordinator( - joinFlowCoordinator: JoinFlowCoordinator(), - loginFlowCoordinator: LoginFlowCoordinator() - ) - self.authCoordinator = coordinator - return coordinator.startFlow() - } + var applicationState: ApplicationState = .initial + var toastBarData: ToastBarData? + var migrationData: MigrationModuleData? + var selectAccountTaskId: String? func deleteAccount() -> AnyView? { if case let .pendingDeletion(deadline) = accountManager.account.status { diff --git a/Anytype/Sources/ApplicationLayer/AppDelegate.swift b/Anytype/Sources/ApplicationLayer/AppDelegate.swift index e8e9d7002e..27a80f57ad 100644 --- a/Anytype/Sources/ApplicationLayer/AppDelegate.swift +++ b/Anytype/Sources/ApplicationLayer/AppDelegate.swift @@ -88,7 +88,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD didReceiveRemoteNotification userInfo: [AnyHashable: Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { - guard FeatureFlags.removeMessagesFromNotificationsCenter, let groupId = userInfo[PushNotificationKeys.groupId] as? String else { + guard let groupId = userInfo[PushNotificationKeys.groupId] as? String else { completionHandler(.noData) return } diff --git a/Anytype/Sources/ApplicationLayer/GlobalEnv/GlobalEnvModifier.swift b/Anytype/Sources/ApplicationLayer/GlobalEnv/GlobalEnvModifier.swift index 01ccd6020f..40dc858554 100644 --- a/Anytype/Sources/ApplicationLayer/GlobalEnv/GlobalEnvModifier.swift +++ b/Anytype/Sources/ApplicationLayer/GlobalEnv/GlobalEnvModifier.swift @@ -4,10 +4,7 @@ import SwiftUI private struct GlobalEnvModifier: ViewModifier { @State private var windowHolder = WindowHolder(window: nil) - @Injected(\.userDefaultsStorage) - private var userDefaults: any UserDefaultsStorageProtocol - @Injected(\.legacyViewControllerProvider) - private var viewControllerProvider: any ViewControllerProviderProtocol + @State private var model = GlobalEnvModifierModel() func body(content: Content) -> some View { content @@ -17,13 +14,30 @@ private struct GlobalEnvModifier: ViewModifier { .setAppInterfaceStyleEnv(window: windowHolder.window) // Legacy :( .onChange(of: windowHolder) { _, newValue in - viewControllerProvider.setSceneWindow(newValue.window) - newValue.window?.overrideUserInterfaceStyle = userDefaults.userInterfaceStyle + model.setSceneWindow(newValue.window) + newValue.window?.overrideUserInterfaceStyle = model.userInterfaceStyle } } } +@MainActor +@Observable +private final class GlobalEnvModifierModel { + @Injected(\.userDefaultsStorage) @ObservationIgnored + private var userDefaults: any UserDefaultsStorageProtocol + @Injected(\.legacyViewControllerProvider) @ObservationIgnored + private var viewControllerProvider: any ViewControllerProviderProtocol + + var userInterfaceStyle: UIUserInterfaceStyle { + userDefaults.userInterfaceStyle + } + + func setSceneWindow(_ window: UIWindow?) { + viewControllerProvider.setSceneWindow(window) + } +} + extension View { func setupGlobalEnv() -> some View { self.modifier(GlobalEnvModifier()) diff --git a/Anytype/Sources/Design system/SheetView/SheetView.swift b/Anytype/Sources/Design system/SheetView/SheetView.swift index 63a7003a7b..e0a5398c14 100644 --- a/Anytype/Sources/Design system/SheetView/SheetView.swift +++ b/Anytype/Sources/Design system/SheetView/SheetView.swift @@ -36,7 +36,7 @@ struct SheetView: View { private var contentView: some View { content - .cornerRadius(16, style: .continuous) + .cornerRadius(34, style: .continuous) .shadow(radius: 20) .padding(.horizontal, 8) .gesture( diff --git a/Anytype/Sources/FrameworkExtensions/SwiftUI/View+iOS26.swift b/Anytype/Sources/FrameworkExtensions/SwiftUI/View+iOS26.swift index 57e2e26ee4..f28ff2e7c2 100644 --- a/Anytype/Sources/FrameworkExtensions/SwiftUI/View+iOS26.swift +++ b/Anytype/Sources/FrameworkExtensions/SwiftUI/View+iOS26.swift @@ -10,4 +10,33 @@ extension View { self } } + + @ViewBuilder + nonisolated public func scrollEdgeEffectStyleIOS26(_ style: ScrollEdgeEffectStyleIOS26?, for edges: Edge.Set) -> some View { + if #available(iOS 26.0, *) { + self.scrollEdgeEffectStyle(style?.style, for: edges) + } else { + self + } + } +} + +public enum ScrollEdgeEffectStyleIOS26 { + case automatic + case hard + case soft +} + +@available(iOS 26.0, *) +public extension ScrollEdgeEffectStyleIOS26 { + var style: ScrollEdgeEffectStyle { + switch self { + case .automatic: + .automatic + case .hard: + .hard + case .soft: + .soft + } + } } diff --git a/Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md b/Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md new file mode 100644 index 0000000000..b1bf0c7cae --- /dev/null +++ b/Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md @@ -0,0 +1,550 @@ +# iOS Development Guide + +Complete guide to iOS development patterns, architecture, and best practices for the Anytype iOS app. + +*Last updated: 2025-01-30* + +## Overview + +The Anytype iOS app is built with Swift and SwiftUI, following MVVM architecture with Coordinator pattern for navigation. This guide covers the patterns, code style, and best practices used throughout the project. + +## âš ī¸ CRITICAL RULES + +1. **NEVER trim whitespace-only lines** - Preserve blank lines with spaces/tabs exactly as they appear +2. **NEVER edit generated files** - Files marked with `// Generated using Sourcery/SwiftGen` +3. **NEVER use hardcoded strings** - Always use localization constants (`Loc.*`) +4. **ALWAYS update tests and mocks** - When refactoring, update all references +5. **Use feature flags for new features** - Wrap experimental code for safe rollouts +6. **Follow MVVM pattern** - ViewModels handle business logic, Views are lightweight + +## đŸ—ī¸ Architecture + +### Technologies + +- **Swift & SwiftUI** - Primary language and UI framework +- **Combine** - Reactive programming +- **Factory** - Dependency injection +- **Middleware** - Custom binary framework for core functionality +- **Protobuf** - Middleware communication + +### Project Structure + +``` +Anytype/Sources/ +├── ApplicationLayer/ # App lifecycle, coordinators +├── PresentationLayer/ # UI components, ViewModels +├── ServiceLayer/ # Business logic, data services +├── Models/ # Data models, entities +├── CoreLayer/ # Core utilities, networking +└── DesignSystem/ # Reusable UI components + +Modules/ # Swift packages +├── Services/ # Core services +├── AnytypeCore/ # Core utilities +├── ProtobufMessages/ # Generated protobuf code +├── Loc/ # Localization +└── Assets/ # Design assets +``` + +### Key Architectural Patterns + +#### 1. MVVM (Model-View-ViewModel) + +**View** (SwiftUI): +```swift +struct ChatView: View { + @StateObject private var model: ChatViewModel + + var body: some View { + // UI only, no business logic + } +} +``` + +**ViewModel**: +```swift +@MainActor +final class ChatViewModel: ObservableObject { + @Published var messages: [Message] = [] + @Injected(\.chatService) private var chatService + + func sendMessage(_ text: String) async { + // Business logic here + } +} +``` + +#### 2. Coordinator Pattern + +Coordinators handle navigation: + +```swift +@MainActor +final class ChatCoordinator: ObservableObject { + @Published var route: Route? + + enum Route { + case settings + case memberList + } + + func showSettings() { + route = .settings + } +} +``` + +#### 3. Repository Pattern + +Data access abstracted through services: + +```swift +protocol ChatRepository { + func fetchMessages() async throws -> [Message] + func sendMessage(_ message: Message) async throws +} + +final class ChatRepositoryImpl: ChatRepository { + // Implementation +} +``` + +#### 4. Dependency Injection (Factory) + +```swift +extension Container { + var chatService: Factory { + Factory(self) { ChatService() } + } +} + +// Usage in ViewModel +@Injected(\.chatService) private var chatService +``` + +## 🔧 Code Style + +### Formatting + +- **Indentation**: 4 spaces (no tabs) +- **Bracket style**: K&R (opening bracket on same line) +- **Line length**: 120-140 characters +- **Blank lines**: One between functions, two between sections +- **Whitespace-only lines**: NEVER trim - preserve exactly as is + +```swift +// ✅ CORRECT +class ChatViewModel { + @Published var messages: [Message] = [] + // ← Preserve blank line with spaces + func sendMessage() { + // Implementation + } +} + +// ❌ WRONG +class ChatViewModel { + @Published var messages: [Message] = [] +// ← Trimmed whitespace - breaks formatting consistency + func sendMessage() { +``` + +### Naming Conventions + +| Type | Convention | Example | +|------|------------|---------| +| Classes, Structs, Protocols | PascalCase | `ChatViewModel`, `UserService` | +| Variables, Functions | camelCase | `objectDetails`, `updateRows()` | +| Extensions | `TypeName+Feature.swift` | `ChatView+Actions.swift` | +| Protocols | Often suffixed with `Protocol` | `ChatServiceProtocol` | + +### Import Order + +```swift +// System frameworks +import Foundation +import SwiftUI +import Combine + +// Third-party +import Factory + +// Internal +import AnytypeCore +import Services +``` + +### Property Organization + +```swift +class ViewModel: ObservableObject { + // 1. Property wrappers + @Published var data: [Item] = [] + @Injected(\.service) private var service + + // 2. Public properties + let title: String + + // 3. Private properties + private var cancellables = Set() + + // 4. Constants + private let maxItems = 100 + + // 5. Computed properties + var isEmpty: Bool { data.isEmpty } + + // 6. Init + init(title: String) { + self.title = title + } + + // 7. Public methods + func loadData() async { } + + // 8. Private methods + private func processData() { } +} +``` + +## đŸŽ¯ Swift Best Practices + +### Use Guard for Early Returns + +```swift +// ✅ CORRECT +func processUser(_ user: User?) { + guard let user else { return } + // Continue with user +} + +// ❌ WRONG +func processUser(_ user: User?) { + if let user = user { + // Deep nesting + } +} +``` + +### Use @MainActor for UI Classes + +```swift +// ✅ CORRECT - Ensures UI updates on main thread +@MainActor +final class ChatViewModel: ObservableObject { + @Published var messages: [Message] = [] +} + +// ❌ WRONG - Can cause UI threading issues +final class ChatViewModel: ObservableObject { + @Published var messages: [Message] = [] +} +``` + +### Async/Await over Completion Handlers + +```swift +// ✅ CORRECT - Modern async/await +func fetchData() async throws -> [Item] { + try await service.fetch() +} + +// ❌ WRONG - Old completion handler style +func fetchData(completion: @escaping (Result<[Item], Error>) -> Void) { + service.fetch(completion: completion) +} +``` + +### Avoid Nested Types + +```swift +// ❌ WRONG - Nested type +struct ChatView: View { + enum MessageType { // Nested in View + case text, image + } +} + +// ✅ CORRECT - Top-level with descriptive name +enum ChatMessageType { + case text, image +} + +struct ChatView: View { + // Use ChatMessageType +} +``` + +### Enum Exhaustiveness + +Always use explicit switch statements to enable compiler warnings when new cases are added: + +```swift +// ✅ CORRECT - Compiler warns if new case added +var showManageButton: Bool { + switch self { + case .sharedSpaces: + return true + case .editors: + return false + } +} + +// ❌ WRONG - Default fallback prevents warnings +var showManageButton: Bool { + if case .sharedSpaces = self { return true } + return false // Won't warn about new cases +} +``` + +**Exception**: Only use default fallback for super obvious single-case checks: +```swift +var isSharedSpaces: Bool { + if case .sharedSpaces = self { return true } + return false +} +``` + +### SwiftUI Property Wrappers + +Use appropriate property wrappers: + +```swift +// State management +@State private var isLoading = false // Local view state +@StateObject private var model = ViewModel() // Own the ViewModel +@ObservedObject var model: ViewModel // Passed from parent + +// Published (in ObservableObject) +@Published var data: [Item] = [] + +// Dependency injection +@Injected(\.service) private var service + +// Environment +@Environment(\.dismiss) private var dismiss +``` + +### Trailing Closures + +```swift +// ✅ CORRECT +Button("Submit") { + submit() +} + +// ❌ WRONG - Unnecessary parentheses +Button("Submit", action: { + submit() +}) +``` + +### Type Inference + +```swift +// ✅ CORRECT - Infer when obvious +let items = [1, 2, 3] +let name = "Chat" + +// ✅ CORRECT - Explicit when needed +let items: [Item] = fetchItems() +let callback: (String) -> Void = handle +``` + +## đŸ§Ē Testing & Mocks + +### Always Update Tests When Refactoring + +When renaming properties or dependencies: + +**1. Search for all references**: +```bash +rg "oldName" --type swift +``` + +**2. Update all locations**: +- Unit tests: `AnyTypeTests/` +- Preview mocks: `Anytype/Sources/PreviewMocks/` +- Mock implementations: `Anytype/Sources/PreviewMocks/Mocks/` +- DI registrations: `MockView.swift`, test setup files + +**Common mistake** (2025-01-16): Refactored `spaceViewStorage` → `spaceViewsStorage` in production code but forgot to update `MockView.swift`, causing test failures. + +### Mock Generation + +Use Sourcery for automatic mock generation: + +```swift +// sourcery: AutoMockable +protocol ChatService { + func fetchMessages() async throws -> [Message] +} + +// After make generate: +// ChatServiceMock automatically created +``` + +## đŸ—‘ī¸ Code Cleanup + +### Remove Unused Code + +After refactoring, always delete: +- Unused properties +- Unused functions +- Entire files that are no longer referenced + +**Example**: If removing a feature, delete: +1. ViewModel file +2. View file +3. Service implementation +4. Tests +5. Mocks +6. Localization keys (see LOCALIZATION_GUIDE.md) + +### Search Before Deleting + +```bash +# Check if type is still used +rg "MyOldViewModel" --type swift + +# Check if file is imported +rg "import MyOldModule" --type swift +``` + +## 🚨 Common Mistakes to Avoid + +### ❌ Autonomous Committing (2025-01-28) + +**NEVER commit without explicit user request**. Committing is destructive and should only happen when user approves. + +### ❌ Wildcard File Deletion (2025-01-24) + +```bash +# WRONG - Used wildcard +rm -f .../PublishingPreview*.swift # Accidentally deleted main UI component + +# CORRECT - Check first, delete individually +ls .../PublishingPreview*.swift # Verify what will be deleted +rm .../PublishingPreviewViewModel.swift # Delete specific file +``` + +### ❌ Incomplete Mock Updates (2025-01-16) + +Refactored production code but forgot to update `MockView.swift`. Always search for ALL references: + +```bash +rg "spaceViewStorage" --type swift # Find all uses +# Update all: production, tests, mocks, DI +``` + +### ❌ Trimming Whitespace-Only Lines + +This breaks formatting consistency. NEVER trim blank lines that contain spaces/tabs. + +### ❌ Hardcoded Strings + +```swift +// WRONG +Text("Add Member") + +// CORRECT +Text(Loc.addMember) +``` + +### ❌ Editing Generated Files + +```swift +// File: Generated/FeatureFlags.swift +// ❌ Don't edit this file - changes will be overwritten +``` + +## 📚 Integration with Other Guides + +- **Localization**: See `LOCALIZATION_GUIDE.md` for using `Loc.*` constants +- **Code Generation**: See `CODE_GENERATION_GUIDE.md` for feature flags and `make generate` +- **Design System**: See `DESIGN_SYSTEM_MAPPING.md` for icons, typography, colors + +## 💡 Best Practices Summary + +### Code Organization + +✅ **DO**: +- Use MVVM pattern (View → ViewModel → Service → Repository) +- Inject dependencies with `@Injected` +- Mark UI classes with `@MainActor` +- Use async/await for asynchronous code +- Use `guard` for early returns +- Organize properties: wrappers → public → private → computed → init → methods + +❌ **DON'T**: +- Put business logic in Views +- Use nested types (extract to top-level) +- Use completion handlers (use async/await) +- Trim whitespace-only lines +- Hardcode strings (use Loc.*) + +### Testing + +✅ **DO**: +- Update tests when refactoring +- Use Sourcery for mock generation +- Search for all references before renaming + +❌ **DON'T**: +- Forget to update mocks +- Skip test updates during refactoring + +### File Management + +✅ **DO**: +- Use descriptive file names +- Follow extension naming: `Type+Feature.swift` +- Delete unused files +- Search before deleting + +❌ **DON'T**: +- Use wildcard deletion +- Leave orphaned files +- Keep unused code "just in case" + +## 📖 Quick Reference + +**Create ViewModel**: +```swift +@MainActor +final class FeatureViewModel: ObservableObject { + @Published var data: [Item] = [] + @Injected(\.service) private var service + + func loadData() async throws { + data = try await service.fetch() + } +} +``` + +**Create Coordinator**: +```swift +@MainActor +final class FeatureCoordinator: ObservableObject { + @Published var route: Route? + + enum Route { case detail, settings } +} +``` + +**Dependency Injection**: +```swift +// Register in Container +extension Container { + var myService: Factory { + Factory(self) { MyService() } + } +} + +// Use in ViewModel +@Injected(\.myService) private var service +``` + +--- + +*This guide is the single source of truth for iOS development patterns. For quick reference, see CLAUDE.md.* \ No newline at end of file diff --git a/Anytype/Sources/Models/Documents/Document/BaseDocument.swift b/Anytype/Sources/Models/Documents/Document/BaseDocument.swift index 07ac0f4a57..b2f86c2eee 100644 --- a/Anytype/Sources/Models/Documents/Document/BaseDocument.swift +++ b/Anytype/Sources/Models/Documents/Document/BaseDocument.swift @@ -268,10 +268,13 @@ final class BaseDocument: BaseDocumentProtocol, @unchecked Sendable { self?.triggerSync(updates: [.syncStatus]) }.store(in: &subscriptions) - accountParticipantsStorage.canEditPublisher(spaceId: spaceId).receiveOnMain().sink { [weak self] canEdit in - self?.participantIsEditor = canEdit - self?.triggerSync(updates: [.restrictions]) + Task { @MainActor [weak self, accountParticipantsStorage, spaceId] in + for await canEdit in accountParticipantsStorage.canEditSequence(spaceId: spaceId) { + self?.participantIsEditor = canEdit + self?.triggerSync(updates: [.restrictions]) + } } + .cancellable() .store(in: &subscriptions) propertyDetailsStorage.relationsDetailsPublisher(spaceId: spaceId) diff --git a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthBackgroundView.swift b/Anytype/Sources/PresentationLayer/Auth/Auth/AuthBackgroundView.swift deleted file mode 100644 index 1c5ca1762a..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthBackgroundView.swift +++ /dev/null @@ -1,55 +0,0 @@ -import SwiftUI - -struct AuthBackgroundView: View where Content: View { - - let url: URL? - let content: () -> Content - - var body: some View { - GeometryReader { geo in - let topOffset = geo.size.height / 6.5 - let bottomOffset = geo.size.height / 4 - let height = geo.size.height - topOffset - bottomOffset - backgroundView( - width: geo.size.width, - height: height, - topOffset: topOffset, - bottomOffset: bottomOffset - ) - } - .background(Color.Background.primary) - .overlay { - navigationView - } - .ignoresSafeArea(.all) - } - - private func backgroundView( - width: CGFloat, - height: CGFloat, - topOffset: CGFloat, - bottomOffset: CGFloat) -> some View - { - VStack(spacing: 0) { - Spacer.fixedHeight(topOffset) - playerView(width: width, height: height) - Spacer.fixedHeight(bottomOffset) - } - } - - private var navigationView: some View { - NavigationStack { - content() - } - .disablePresentationBackground() - } - - @ViewBuilder - private func playerView(width: CGFloat, height: CGFloat) -> some View { - if let url { - LoopingPlayerView(url: url) - .aspectRatio(UIDevice.isPad ? 0.85 : 0.53, contentMode: .fill) - .frame(width: width, height: height) - } - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthCoordinator.swift b/Anytype/Sources/PresentationLayer/Auth/Auth/AuthCoordinator.swift deleted file mode 100644 index 326f5cc03b..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthCoordinator.swift +++ /dev/null @@ -1,43 +0,0 @@ -import SwiftUI - -@MainActor -protocol AuthCoordinatorProtocol { - func startFlow() -> AnyView -} - -@MainActor -final class AuthCoordinator: AuthCoordinatorProtocol, AuthViewModelOutput { - - // MARK: - DI - - private let joinFlowCoordinator: any JoinFlowCoordinatorProtocol - private let loginFlowCoordinator: any LoginFlowCoordinatorProtocol - - init( - joinFlowCoordinator: some JoinFlowCoordinatorProtocol, - loginFlowCoordinator: some LoginFlowCoordinatorProtocol - ) { - self.joinFlowCoordinator = joinFlowCoordinator - self.loginFlowCoordinator = loginFlowCoordinator - } - - // MARK: - AuthCoordinatorProtocol - - func startFlow() -> AnyView { - AuthView(output: self).eraseToAnyView() - } - - // MARK: - AuthViewModelOutput - - func onJoinAction(state: JoinFlowState) -> AnyView { - joinFlowCoordinator.startFlow(state: state) - } - - func onLoginAction() -> AnyView { - loginFlowCoordinator.startFlow() - } - - func onSettingsAction() -> AnyView { - ServerConfigurationCoordinatorView().eraseToAnyView() - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthView.swift b/Anytype/Sources/PresentationLayer/Auth/Auth/AuthView.swift deleted file mode 100644 index 70ae6efc3a..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthView.swift +++ /dev/null @@ -1,120 +0,0 @@ -import SwiftUI -import AnytypeCore -import AudioToolbox - -struct AuthView: View { - - @StateObject private var model: AuthViewModel - - init(output: (any AuthViewModelOutput)?) { - _model = StateObject(wrappedValue: AuthViewModel(output: output)) - } - - var body: some View { - AuthBackgroundView(url: model.videoUrl()) { - content - } - } - - private var content: some View { - VStack(alignment: .center, spacing: 0) { - header - Spacer.fixedHeight(48) - Spacer() - greetings - Spacer() - buttons - Spacer.fixedHeight(16) - privacyPolicy - Spacer.fixedHeight(14) - } - .padding(.horizontal, 20) - .ignoresSafeArea(.keyboard) - .navigationBarHidden(true) - .opacity(model.opacity) - .onAppear { - model.onAppear() - } - .disablePresentationBackground() - .ifLet(model.errorText) { view, errorText in - view.alertView(isShowing: $model.showError, errorText: errorText, onButtonTap: {}) - } - .fitIPadToReadableContentGuide() - } - - @ViewBuilder - private var greetings: some View { - Image(asset: .Auth.greetings) - .onTapGesture(count: 10) { - AudioServicesPlaySystemSound(1109) - model.showDebugMenu.toggle() - } - .sheet(isPresented: $model.showDebugMenu) { - DebugMenuView() - } - } - - private var header: some View { - HStack { - Spacer() - Button { - model.showSettings.toggle() - } label: { - Image(asset: .NavigationBase.settings) - .foregroundColor(.Control.secondary) - } - .disabled(model.inProgress) - } - .sheet(isPresented: $model.showSettings) { - model.onSettingsAction() - } - } - - private var buttons: some View { - VStack(spacing: 12) { - StandardButton( - Loc.Auth.Button.join, - inProgress: model.inProgress, - style: .primaryLarge, - action: { - model.onJoinButtonTap() - } - ) - .colorScheme(.light) - .navigationDestination(isPresented: $model.showJoinFlow) { - model.onJoinAction() - } - - StandardButton( - Loc.Auth.logIn, - style: .secondaryLarge, - action: { - model.onLoginButtonTap() - } - ) - .navigationDestination(isPresented: $model.showLoginFlow) { - model.onLoginAction() - } - .disabled(model.inProgress) - } - } - - private var privacyPolicy: some View { - AnytypeText( - Loc.agreementDisclamer(AboutApp.termsLink, AboutApp.privacyPolicyLink), - style: .authCaption, - enableMarkdown: true - ) - .foregroundColor(.Auth.caption) - .multilineTextAlignment(.center) - .padding(.horizontal, 38) - .accentColor(.Auth.body) - .disabled(model.inProgress) - } -} - -struct AuthView_Previews : PreviewProvider { - static var previews: some View { - AuthView(output: nil) - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModel.swift deleted file mode 100644 index 1dabfe2d40..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModel.swift +++ /dev/null @@ -1,179 +0,0 @@ -import SwiftUI -import Combine -import Services -import AnytypeCore - -enum AuthViewModelError: Error { - case unsupportedAppAction -} - -@MainActor -final class AuthViewModel: ObservableObject { - - @Published var showJoinFlow: Bool = false - @Published var showLoginFlow: Bool = false - @Published var showDebugMenu: Bool = false - @Published var showSettings: Bool = false - @Published var inProgress = false - @Published var opacity: Double = 1 - @Published var errorText: String? { - didSet { showError = errorText.isNotNil } - } - @Published var showError: Bool = false - - // MARK: - State - private let state = JoinFlowState() - - // MARK: - Private - private weak var output: (any AuthViewModelOutput)? - - @Injected(\.serverConfigurationStorage) - private var serverConfigurationStorage: any ServerConfigurationStorageProtocol - @Injected(\.appActionStorage) - private var appActionsStorage: AppActionStorage - @Injected(\.authService) - private var authService: any AuthServiceProtocol - @Injected(\.seedService) - private var seedService: any SeedServiceProtocol - @Injected(\.usecaseService) - private var usecaseService: any UsecaseServiceProtocol - @Injected(\.workspaceService) - private var workspaceService: any WorkspaceServiceProtocol - @Injected(\.pushNotificationsPermissionService) - private var pushNotificationsPermissionService: any PushNotificationsPermissionServiceProtocol - - private var subscription: AnyCancellable? - - init(output: (any AuthViewModelOutput)?) { - self.output = output - } - - // MARK: - Public - - func onAppear() { - changeContentOpacity(false) - startSubscriptions() - AnytypeAnalytics.instance().logMainAuthScreenShow() - } - - private func startSubscriptions() { - subscription = appActionsStorage.$action.receiveOnMain().sink { [weak self] action in - guard let action, let self else { return } - - if (try? handleAppAction(action: action)).isNotNil { - appActionsStorage.action = nil - } - } - } - - func videoUrl() -> URL? { - guard let url = Bundle.main.url(forResource: "anytype-shader-S", withExtension: "mp4") else { - return nil - } - return url - } - - func onJoinButtonTap() { - if state.mnemonic.isEmpty { - createAccount() - } else { - onSuccess() - } - } - - func onJoinAction() -> AnyView? { - output?.onJoinAction(state: state) - } - - func onLoginButtonTap() { - showLoginFlow.toggle() - changeContentOpacity(true) - } - - func onLoginAction() -> AnyView? { - output?.onLoginAction() - } - - func onSettingsButtonTap() { - showSettings.toggle() - } - - func onSettingsAction() -> AnyView? { - return output?.onSettingsAction() - } - - // MARK: - Create account step - - private func createAccount() { - Task { - AnytypeAnalytics.instance().logStartCreateAccount() - inProgress = true - - do { - state.mnemonic = try await authService.createWallet() - let iconOption = IconColorStorage.randomOption() - let account = try await authService.createAccount( - name: "", - iconOption: iconOption, - imagePath: "" - ) - await pushNotificationsPermissionService.registerForRemoteNotificationsIfNeeded() - try await setDefaultSpaceInfo(account.info.accountSpaceId, iconOption: iconOption) - try? seedService.saveSeed(state.mnemonic) - - onSuccess() - } catch { - createAccountError(error) - } - } - } - - private func setDefaultSpaceInfo(_ spaceId: String, iconOption: Int) async throws { - guard spaceId.isNotEmpty else { return } - let startingObjectId = try? await usecaseService.setObjectImportDefaultUseCase(spaceId: spaceId) - if !FeatureFlags.turnOffAutomaticWidgetOpening, let startingObjectId, startingObjectId.isNotEmpty, appActionsStorage.action.isNil { - appActionsStorage.action = .openObject(objectId: startingObjectId, spaceId: spaceId) - } - try? await workspaceService.workspaceSetDetails( - spaceId: spaceId, - details: [.name(Loc.myFirstSpace), .iconOption(iconOption)] - ) - } - - private func onSuccess() { - inProgress = false - showJoinFlow.toggle() - changeContentOpacity(true) - } - - private func createAccountError(_ error: some Error) { - inProgress = false - errorText = error.localizedDescription - } - - private func changeContentOpacity(_ hide: Bool) { - withAnimation(.fastSpring) { - opacity = hide ? 0 : 1 - } - } - - private func handleAppAction(action: AppAction) throws { - switch action { - case .createObjectFromQuickAction, .openObject: - throw AuthViewModelError.unsupportedAppAction - case .deepLink(let deeplink, _): - switch deeplink { - case .networkConfig(let config): - try updateNetworkConfig(config) - case .createObjectFromWidget, .showSharingExtension, .galleryImport, .invite, .object, .membership: - throw AuthViewModelError.unsupportedAppAction - } - } - } - - private func updateNetworkConfig(_ config: String) throws { - try serverConfigurationStorage.addConfiguration(fileBase64Content: config, setupAsCurrent: true) - AnytypeAnalytics.instance().logUploadNetworkConfiguration() - AnytypeAnalytics.instance().logSelectNetwork(type: .selfHost, route: .deeplink) - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModelOutput.swift b/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModelOutput.swift deleted file mode 100644 index 7608dc6e2b..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/Auth/AuthViewModelOutput.swift +++ /dev/null @@ -1,8 +0,0 @@ -import SwiftUI - -@MainActor -protocol AuthViewModelOutput: AnyObject { - func onJoinAction(state: JoinFlowState) -> AnyView - func onLoginAction() -> AnyView - func onSettingsAction() -> AnyView -} diff --git a/Anytype/Sources/PresentationLayer/AuthNew/AuthCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Auth/AuthCoordinatorView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/AuthCoordinatorView.swift rename to Anytype/Sources/PresentationLayer/Auth/AuthCoordinatorView.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/AuthCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/AuthCoordinatorViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/AuthCoordinatorViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/AuthCoordinatorViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthCircle.swift b/Anytype/Sources/PresentationLayer/Auth/Circle/AuthCircle.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthCircle.swift rename to Anytype/Sources/PresentationLayer/Auth/Circle/AuthCircle.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthCircleEnv.swift b/Anytype/Sources/PresentationLayer/Auth/Circle/AuthCircleEnv.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthCircleEnv.swift rename to Anytype/Sources/PresentationLayer/Auth/Circle/AuthCircleEnv.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthOverlayCircle.swift b/Anytype/Sources/PresentationLayer/Auth/Circle/AuthOverlayCircle.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Circle/AuthOverlayCircle.swift rename to Anytype/Sources/PresentationLayer/Auth/Circle/AuthOverlayCircle.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinCoordinatorView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinCoordinatorView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinCoordinatorView.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinCoordinatorViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinCoordinatorViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinCoordinatorViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/EmailCollectionView/EmailCollectionView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/EmailCollectionView/EmailCollectionView.swift similarity index 91% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/EmailCollectionView/EmailCollectionView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/EmailCollectionView/EmailCollectionView.swift index c95fedf70e..bbe97c5db4 100644 --- a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/EmailCollectionView/EmailCollectionView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/EmailCollectionView/EmailCollectionView.swift @@ -37,7 +37,7 @@ struct EmailCollectionView: View { Loc.Auth.JoinFlow.Email.description, style: .bodyRegular ) - .foregroundColor(FeatureFlags.brandNewAuthFlow ? .Text.secondary : .Text.primary) + .foregroundColor(.Text.secondary) .multilineTextAlignment(.center) .padding(.horizontal, 20) @@ -81,7 +81,7 @@ struct EmailCollectionView: View { StandardButton( Loc.continue, inProgress: model.inProgress, - style: FeatureFlags.brandNewAuthFlow ? .primaryOvalLarge : .primaryLarge, + style: .primaryLarge, action: { model.onNextAction() } @@ -91,7 +91,7 @@ struct EmailCollectionView: View { if FeatureFlags.skipOnboardingEmailCollection { StandardButton( Loc.skip, - style: FeatureFlags.brandNewAuthFlow ? .linkLarge : .secondaryLarge, + style: .linkLarge, action: { model.onSkipAction() } diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/EmailCollectionView/EmailCollectionViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/EmailCollectionView/EmailCollectionViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/EmailCollectionView/EmailCollectionViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/EmailCollectionView/EmailCollectionViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinBaseOutput.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinBaseOutput.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinBaseOutput.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinBaseOutput.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionOption.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionOption.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionOption.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionOption.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/InfoSelectionView/InfoSelectionView.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionType.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionType.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionType.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionType.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionView.swift similarity index 97% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionView.swift index bb248cdf03..94e61d2e62 100644 --- a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionView.swift @@ -34,7 +34,7 @@ struct JoinSelectionView: View { VStack(spacing: 8) { StandardButton( Loc.continue, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.onNextAction() } diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinSelectionView/JoinSelectionViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinSelectionView/JoinSelectionViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinStep.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinStep.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinStep.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinStep.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinView.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Join/JoinView/JoinViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/JoinView/JoinViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseMoreInfoView/KeyPhraseMoreInfoView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseMoreInfoView/KeyPhraseMoreInfoView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseMoreInfoView/KeyPhraseMoreInfoView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseMoreInfoView/KeyPhraseMoreInfoView.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseView/KeyPhraseView.swift b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseView/KeyPhraseView.swift similarity index 98% rename from Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseView/KeyPhraseView.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseView/KeyPhraseView.swift index 3a1102e7e1..e3f195a4a8 100644 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseView/KeyPhraseView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseView/KeyPhraseView.swift @@ -87,7 +87,7 @@ struct KeyPhraseView: View { private var buttons: some View { VStack(spacing: 0) { StandardButton(model.keyShown ? Loc.Auth.JoinFlow.Key.Button.Saved.title : Loc.Auth.JoinFlow.Key.Button.Show.title, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.onPrimaryButtonTap() } diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseView/KeyPhraseViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseView/KeyPhraseViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Auth/JoinFlow/KeyPhraseView/KeyPhraseViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/Shared/KeyPhraseView/KeyPhraseViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowState.swift b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/Models/JoinFlowState.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowState.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/Shared/Models/JoinFlowState.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowStepOutput.swift b/Anytype/Sources/PresentationLayer/Auth/Join/Shared/Models/JoinFlowStepOutput.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowStepOutput.swift rename to Anytype/Sources/PresentationLayer/Auth/Join/Shared/Models/JoinFlowStepOutput.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowCoordinator.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowCoordinator.swift deleted file mode 100644 index c91410819a..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowCoordinator.swift +++ /dev/null @@ -1,33 +0,0 @@ -import SwiftUI - -@MainActor -protocol JoinFlowCoordinatorProtocol { - func startFlow(state: JoinFlowState) -> AnyView -} - -@MainActor -final class JoinFlowCoordinator: JoinFlowCoordinatorProtocol, JoinFlowOutput { - - // MARK: - JoinFlowCoordinatorProtocol - - func startFlow(state: JoinFlowState) -> AnyView { - JoinFlowView(state: state, output: self).eraseToAnyView() - } - - // MARK: - JoinFlowOutput - - func onStepChanged(_ step: JoinFlowStep, state: JoinFlowState, output: some JoinFlowStepOutput) -> AnyView { - switch step { - case .key: - KeyPhraseView(state: state, output: output).eraseToAnyView() - case .soul: - SoulView(state: state, output: output).eraseToAnyView() - case .email: - EmailCollectionView(state: state, output: output).eraseToAnyView() - } - } - - func keyPhraseMoreInfo() -> AnyView { - KeyPhraseMoreInfoView().eraseToAnyView() - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowOutput.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowOutput.swift deleted file mode 100644 index 3cb2380a94..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowOutput.swift +++ /dev/null @@ -1,9 +0,0 @@ -import SwiftUI - -@MainActor -protocol JoinFlowOutput: AnyObject { - - func onStepChanged(_ step: JoinFlowStep, state: JoinFlowState, output: some JoinFlowStepOutput) -> AnyView - func keyPhraseMoreInfo() -> AnyView - -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowView.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowView.swift deleted file mode 100644 index ddbfe910ec..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowView.swift +++ /dev/null @@ -1,89 +0,0 @@ -import SwiftUI - -struct JoinFlowView: View { - - @StateObject private var model: JoinFlowViewModel - @Environment(\.dismiss) private var dismiss - - init(state: JoinFlowState, output: (any JoinFlowOutput)?) { - _model = StateObject(wrappedValue: JoinFlowViewModel(state: state, output: output)) - } - - var body: some View { - GeometryReader { geo in - if !model.hideContent { - content(height: geo.size.height) - } - } - .customBackSwipe { - guard !model.disableBackAction else { return } - if model.step.isFirst { - dismiss() - } else { - model.onBack() - } - } - .ifLet(model.errorText) { view, errorText in - view.alertView(isShowing: $model.showError, errorText: errorText, onButtonTap: {}) - } - .fitIPadToReadableContentGuide() - .navigationBarHidden(true) - } - - private func content(height: CGFloat) -> some View { - VStack(spacing: 0) { - Spacer.fixedHeight(14) - - navigationBar - - Spacer.fixedHeight( - UIDevice.isPad ? height / Constants.offsetFactor : Constants.topOffset - ) - - model.content() - .transition(model.forward ? .moveAndFadeForward: .moveAndFadeBack) - - Spacer.fixedHeight(14) - } - .disablePresentationBackground() - .padding(.horizontal, 16) - } - - private var navigationBar : some View { - HStack { - backButton - Spacer() - } - .frame(height: 44) - } - - private var backButton : some View { - Button(action: { - if model.step.isFirst { - dismiss() - } else { - model.onBack() - } - }) { - Image(asset: .X18.slashMenuArrow) - .foregroundColor(.Control.secondary) - .padding(EdgeInsets(top: 10, leading: 0, bottom: 10, trailing: 10)) - } - .disabled(model.disableBackAction) - } -} - - -struct JoinFlowView_Previews : PreviewProvider { - static var previews: some View { - JoinFlowView(state: JoinFlowState(), output: nil) - } -} - -extension JoinFlowView { - enum Constants { - @MainActor - static let offsetFactor = UIDevice.isPad ? 3.5 : 4.5 - static let topOffset: CGFloat = 20 - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowViewModel.swift deleted file mode 100644 index 24d9c819d2..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/JoinFlowViewModel.swift +++ /dev/null @@ -1,93 +0,0 @@ -import SwiftUI - -@MainActor -final class JoinFlowViewModel: ObservableObject, JoinFlowStepOutput { - - @Published var step: JoinFlowStep = JoinFlowStep.firstStep - @Published var forward = true - @Published var errorText: String? { - didSet { - showError = errorText.isNotNil - } - } - @Published var showError: Bool = false - @Published var disableBackAction: Bool = false - @Published var hideContent = false - - private let state: JoinFlowState - - private weak var output: (any JoinFlowOutput)? - @Injected(\.applicationStateService) - private var applicationStateService: any ApplicationStateServiceProtocol - @Injected(\.accountManager) - private var accountManager: any AccountManagerProtocol - @Injected(\.serverConfigurationStorage) - private var serverConfigurationStorage: any ServerConfigurationStorageProtocol - - init(state: JoinFlowState, output: (any JoinFlowOutput)?) { - self.state = state - self.output = output - } - - func content() -> AnyView? { - output?.onStepChanged(step, state: state, output: self) - } - - // MARK: - JoinStepOutput - - func onNext() { - guard let nextStep = step.next else { - finishFlow() - return - } - - if nextStep == .email && shouldSkipEmailStep() { - finishFlow() - return - } - - forward = true - - withAnimation { - step = nextStep - } - } - - func onBack() { - guard let previousStep = step.previous else { return } - - UIApplication.shared.hideKeyboard() - forward = false - - withAnimation { - step = previousStep - } - } - - func onError(_ error: some Error) { - errorText = error.localizedDescription - } - - func disableBackAction(_ disable: Bool) { - disableBackAction = disable - } - - func keyPhraseMoreInfo() -> AnyView? { - output?.keyPhraseMoreInfo() - } - - private func finishFlow() { - hideContent.toggle() // hack to avoid inappropriate animation when hiding - applicationStateService.state = .home - AnytypeAnalytics.instance().logAccountOpen( - analyticsId: accountManager.account.info.analyticsId - ) - if state.soul.isEmpty { - AnytypeAnalytics.instance().logOnboardingSkipName() - } - } - - private func shouldSkipEmailStep() -> Bool { - serverConfigurationStorage.currentConfiguration() == .localOnly - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowStep.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowStep.swift deleted file mode 100644 index cb979aab28..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/Models/JoinFlowStep.swift +++ /dev/null @@ -1,29 +0,0 @@ -enum JoinFlowStep: Int, CaseIterable { - case key = 1 - case soul - case email - - var next: JoinFlowStep? { - let nextStepNumber = rawValue + 1 - guard let nextStep = JoinFlowStep(rawValue: nextStepNumber) else { - return nil - } - return nextStep - } - - var previous: JoinFlowStep? { - let previousStepNumber = rawValue - 1 - guard let previousStep = JoinFlowStep(rawValue: previousStepNumber) else { - return nil - } - return previousStep - } - - static var firstStep: JoinFlowStep { - JoinFlowStep.allCases.first ?? .key - } - - var isFirst: Bool { - self == JoinFlowStep.allCases.first - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulView.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulView.swift deleted file mode 100644 index 3a1a1ae287..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulView.swift +++ /dev/null @@ -1,79 +0,0 @@ -import SwiftUI - -struct SoulView: View { - - @StateObject private var model: SoulViewModel - - init(state: JoinFlowState, output: (any JoinFlowStepOutput)?) { - _model = StateObject(wrappedValue: SoulViewModel(state: state, output: output)) - } - - var body: some View { - VStack(spacing: 0) { - content - - Spacer() - - StandardButton( - Loc.continue, - inProgress: model.inProgress, - style: .primaryLarge, - action: { - model.onNextAction() - } - ) - .colorScheme(.light) - } - .task { - await model.startParticipantTask() - } - .onAppear { - model.onAppear() - } - } - - private var content: some View { - VStack(spacing: 0) { - AnytypeText(Loc.Auth.JoinFlow.Soul.title, style: .contentTitleSemibold) - .foregroundColor(.Text.primary) - .multilineTextAlignment(.center) - - Spacer.fixedHeight(8) - - AnytypeText( - Loc.Auth.JoinFlow.Soul.description, - style: .bodyRegular - ) - .foregroundColor(.Text.primary) - .multilineTextAlignment(.center) - .padding(.horizontal, 20) - - Spacer.fixedHeight(24) - - input - } - .padding(.horizontal, UIDevice.isPad ? 75 : 0) - } - - private var input: some View { - AutofocusedTextField( - placeholder: model.generatedNamePlaceholder, - font: .authInput, - text: $model.inputText - ) - .disableAutocorrection(true) - .autocapitalization(.sentences) - .foregroundColor(.Auth.inputText) - .padding(EdgeInsets(horizontal: 20, vertical: 20)) - .background(Color.Shape.transperentSecondary) - .accentColor(.Text.tertiary) - .cornerRadius(16) - .frame(height: 64) - } -} - -struct JoinFlowInputView_Previews: PreviewProvider { - static var previews: some View { - SoulView(state: JoinFlowState(), output: nil) - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulViewModel.swift deleted file mode 100644 index 93ac3e8dab..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/JoinFlow/SoulView/SoulViewModel.swift +++ /dev/null @@ -1,91 +0,0 @@ -import SwiftUI -import Services - -@MainActor -final class SoulViewModel: ObservableObject { - - @Published var inputText: String { - didSet { - state.soul = inputText - } - } - @Published var inProgress = false - @Published var generatedNamePlaceholder = "" - - // MARK: - DI - - private let state: JoinFlowState - private weak var output: (any JoinFlowStepOutput)? - - @Injected(\.accountManager) - private var accountManager: any AccountManagerProtocol - @Injected(\.objectActionsService) - private var objectActionsService: any ObjectActionsServiceProtocol - @Injected(\.participantsStorage) - private var accountParticipantStorage: any ParticipantsStorageProtocol - - init(state: JoinFlowState, output: (any JoinFlowStepOutput)?) { - self.state = state - self.inputText = state.soul - self.output = output - } - - func onAppear() { - AnytypeAnalytics.instance().logScreenOnboarding(step: .soul) - } - - func onNextAction() { - updateNames() - } - - func startParticipantTask() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: accountManager.account.info.accountSpaceId).values { - generatedNamePlaceholder = participant.localName - } - } - - // MARK: - Update names step - - private func onSuccess() { - stopLoading() - UIApplication.shared.hideKeyboard() - output?.onNext() - } - - private func updateNameError(_ error: some Error) { - stopLoading() - output?.onError(error) - } - - private func updateNames() { - guard state.soul.isNotEmpty else { - onSuccess() - return - } - - Task { - startLoading() - - do { - try await objectActionsService.updateBundledDetails( - contextID: accountManager.account.info.profileObjectID, - details: [.name(state.soul)] - ) - - onSuccess() - } catch { - updateNameError(error) - } - } - } - - private func startLoading() { - output?.disableBackAction(true) - inProgress = true - } - - private func stopLoading() { - output?.disableBackAction(false) - inProgress = false - } -} diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Auth/Login/LoginCoordinatorView.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Login/LoginCoordinatorView.swift rename to Anytype/Sources/PresentationLayer/Auth/Login/LoginCoordinatorView.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Login/LoginCoordinatorViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Login/LoginCoordinatorViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Login/LoginCoordinatorViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginOutput.swift b/Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginOutput.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginOutput.swift rename to Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginOutput.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginView.swift b/Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginView.swift similarity index 99% rename from Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginView.swift rename to Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginView.swift index 4cb257ee67..a0536ce3db 100644 --- a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginView.swift @@ -92,7 +92,7 @@ struct LoginView: View { StandardButton( Loc.enter, inProgress: model.loadingInProgress, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.onEnterButtonAction() } diff --git a/Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/Login/LoginView/LoginViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/Login/LoginView/LoginViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedView.swift b/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedView.swift deleted file mode 100644 index a371a050ca..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedView.swift +++ /dev/null @@ -1,152 +0,0 @@ -import SwiftUI - -struct LoginDepricatedView: View { - - @StateObject private var model: LoginDepricatedViewModel - @Environment(\.dismiss) private var dismiss - - init(output: (any LoginFlowOutput)?) { - _model = StateObject(wrappedValue: LoginDepricatedViewModel(output: output)) - } - - var body: some View { - content - .task(id: model.accountId) { - await model.selectAccount() - } - .task(id: model.entropy) { - await model.onEntropySet() - } - .task { - await model.handleAccountShowEvent() - } - .navigationBarBackButtonHidden(true) - .navigationBarTitleDisplayMode(.inline) - .disablePresentationBackground() - .padding(.horizontal, 16) - .toolbar { - ToolbarItem(placement: .navigationBarLeading) { - backButton - } - ToolbarItem(placement: .principal) { - Text(Loc.Auth.LoginFlow.Enter.title) - .onTapGesture(count: 5) { - model.showDebugMenu.toggle() - } - } - } - .sheet(isPresented: $model.showQrCodeView) { - QrCodeScannerView(qrCode: self.$model.entropy, error: self.$model.errorText) - } - .cameraPermissionAlert(isPresented: $model.openSettingsURL) - .ifLet(model.errorText) { view, errorText in - view.alertView(isShowing: $model.showError, errorText: errorText) - } - .onAppear { - model.onAppear() - } - .customBackSwipe { - guard !model.loadingRoute.isLoadingInProgress else { return } - dismiss() - } - .fitIPadToReadableContentGuide() - .onChange(of: model.dismiss) { dismiss() } - - .sheet(isPresented: $model.showDebugMenu) { - PublicDebugMenuView() - } - .anytypeSheet(item: $model.secureAlertData) { - SecureAlertView(data: $0) - } - - // migration - .fullScreenCover(item: $model.migrationData) { - MigrationCoordinatorView(data: $0) - } - } - - private var content: some View { - VStack(spacing: 0) { - Spacer.fixedHeight(16) - - PhraseTextView( - text: $model.phrase, - noninteractive: false, - alignTextToCenter: false, - hideWords: false - ) - .focused($model.autofocus) - .disabled(model.loadingRoute.isLoadingInProgress) - - Spacer.fixedHeight(16) - - buttonsBlock - - Spacer() - } - } - - private var buttonsBlock : some View { - VStack(spacing: 12) { - StandardButton( - Loc.Auth.LoginFlow.Enter.title, - inProgress: model.loadingRoute.isLoginInProgress, - style: .primaryLarge, - action: { - model.onEnterButtonAction() - } - ) - .colorScheme(model.loginButtonDisabled ? .dark : .light) - .disabled(model.loginButtonDisabled) - - AnytypeText( - Loc.Auth.LoginFlow.or, - style: .caption2Medium - ) - .foregroundColor(.Auth.inputText) - - HStack(spacing: 8) { - StandardButton( - Loc.scanQRCode, - inProgress: model.loadingRoute.isQRInProgress, - style: .secondaryLarge, - action: { - model.onScanQRButtonAction() - } - ) - .disabled(model.qrButtonDisabled) - - if model.canRestoreFromKeychain { - StandardButton( - Loc.Auth.LoginFlow.Use.Keychain.title, - inProgress: model.loadingRoute.isKeychainInProgress, - style: .secondaryLarge, - action: { - model.onKeychainButtonAction() - } - ) - .disabled(model.keychainButtonDisabled) - } - } - } - } - - private var backButton : some View { - Button(action: { - model.onbackButtonAction() - }) { - Image(asset: .backArrow) - .foregroundColor(.Text.tertiary) - } - .disabled(model.backButtonDisabled) - } -} - - -struct LoginView_Previews : PreviewProvider { - static var previews: some View { - NavigationView { - LoginDepricatedView(output: nil) - } - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedViewModel.swift deleted file mode 100644 index 055ef6c5e0..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginDepricatedViewModel.swift +++ /dev/null @@ -1,225 +0,0 @@ -import SwiftUI -@preconcurrency import Combine -import AnytypeCore -import Services - -@MainActor -final class LoginDepricatedViewModel: ObservableObject { - @Published var phrase = "" - @Published var autofocus = true - - @Published var loadingRoute = LoginLoadingRoute.none - @Published var accountSelectInProgress = false - - @Published var showQrCodeView: Bool = false - @Published var openSettingsURL = false - @Published var showDebugMenu = false - @Published var entropy: String = "" - @Published var errorText: String? { - didSet { - showError = errorText.isNotNil - } - } - @Published var showError: Bool = false - @Published var dismiss = false - @Published var accountId: String? - @Published var migrationData: MigrationModuleData? - @Published var secureAlertData: SecureAlertData? - - var loginButtonDisabled: Bool { - phrase.isEmpty || loadingRoute.isKeychainInProgress || loadingRoute.isQRInProgress - } - - var qrButtonDisabled: Bool { - loadingRoute.isKeychainInProgress || loadingRoute.isLoginInProgress - } - - var keychainButtonDisabled: Bool { - loadingRoute.isQRInProgress || loadingRoute.isLoginInProgress - } - - var backButtonDisabled: Bool { - loadingRoute.isLoadingInProgress && !accountSelectInProgress - } - - lazy var canRestoreFromKeychain = (try? seedService.obtainSeed()).isNotNil - - @Injected(\.authService) - private var authService: any AuthServiceProtocol - @Injected(\.seedService) - private var seedService: any SeedServiceProtocol - @Injected(\.localAuthService) - private var localAuthService: any LocalAuthServiceProtocol - @Injected(\.cameraPermissionVerifier) - private var cameraPermissionVerifier: any CameraPermissionVerifierProtocol - @Injected(\.accountEventHandler) - private var accountEventHandler: any AccountEventHandlerProtocol - @Injected(\.applicationStateService) - private var applicationStateService: any ApplicationStateServiceProtocol - @Injected(\.pushNotificationsPermissionService) - private var pushNotificationsPermissionService: any PushNotificationsPermissionServiceProtocol - - private weak var output: (any LoginFlowOutput)? - - init(output: (any LoginFlowOutput)?) { - self.output = output - } - - func onAppear() { - AnytypeAnalytics.instance().logLoginScreenShow() - } - - func onEnterButtonAction() { - AnytypeAnalytics.instance().logClickLogin(button: .phrase) - walletRecoverySync(with: phrase, route: .login) - } - - func onScanQRButtonAction() { - AnytypeAnalytics.instance().logClickLogin(button: .qr) - Task { - let isGranted = await cameraPermissionVerifier.cameraIsGranted() - if isGranted { - showQrCodeView = true - } else { - openSettingsURL = true - } - } - } - - func onKeychainButtonAction() { - AnytypeAnalytics.instance().logClickLogin(button: .keychain) - Task { - try await localAuthWithContinuation { [weak self] in - guard let self else { return } - let phrase = try seedService.obtainSeed() - await walletRecovery(with: phrase, route: .keychain) - } - } - } - - private func localAuthWithContinuation(_ continuation: @escaping () async throws -> Void) async throws { - do { - try await localAuthService.auth(reason: Loc.accessToKeyFromKeychain) - try await continuation() - } catch LocalAuthServiceError.passcodeNotSet { - secureAlertData = SecureAlertData(completion: { proceed in - guard proceed else { return } - try await continuation() - }) - } - } - - func onbackButtonAction() { - guard accountSelectInProgress else { - dismiss.toggle() - return - } - accountId = nil - logout() - } - - private func logout() { - Task { - try await authService.logout(removeData: false) - dismiss.toggle() - } - } - - func onEntropySet() async { - guard entropy.isNotEmpty else { return } - do { - let phrase = try await authService.mnemonicByEntropy(entropy) - await walletRecovery(with: phrase, route: .qr) - } catch { - errorText = error.localizedDescription - } - } - - private func walletRecoverySync(with phrase: String, route: LoginLoadingRoute) { - Task { - await walletRecovery(with: phrase, route: route) - } - } - - private func walletRecovery(with phrase: String, route: LoginLoadingRoute) async { - do { - self.phrase = phrase - loadingRoute = route - - try await authService.walletRecovery(mnemonic: phrase.trimmingCharacters(in: .whitespacesAndNewlines)) - try seedService.saveSeed(phrase) - - await recoverWalletSuccess() - } catch { - recoverWalletError(error) - } - } - - private func recoverWalletSuccess() async { - await accountRecover() - } - - private func recoverWalletError(_ error: some Error) { - stopButtonsLoading() - errorText = error.localizedDescription - } - - func handleAccountShowEvent() async { - for await accountId in await accountEventHandler.accountShowPublisher.values { - self.accountId = accountId - } - } - - private func accountRecover() async { - do { - try await authService.accountRecover() - } catch { - stopButtonsLoading() - errorText = error.localizedDescription - } - } - - func selectAccount() async { - guard let accountId else { return } - defer { - stopButtonsLoading() - accountSelectInProgress = false - } - do { - accountSelectInProgress = true - let account = try await authService.selectAccount(id: accountId) - - switch account.status { - case .active: - applicationStateService.state = .home - case .pendingDeletion: - applicationStateService.state = .delete - case .deleted: - errorText = Loc.vaultDeleted - } - - await pushNotificationsPermissionService.registerForRemoteNotificationsIfNeeded() - } catch is CancellationError { - // Ignore cancellations - } catch SelectAccountError.accountLoadIsCanceled { - // Ignore load cancellation - } catch SelectAccountError.accountIsDeleted { - errorText = Loc.vaultDeleted - } catch SelectAccountError.failedToFetchRemoteNodeHasIncompatibleProtoVersion { - errorText = Loc.Vault.Select.Incompatible.Version.Error.text - } catch SelectAccountError.accountStoreNotMigrated { - migrationData = MigrationModuleData( - id: accountId, - onFinish: { [weak self] in - await self?.selectAccount() - } - ) - } catch { - errorText = Loc.selectVaultError - } - } - - private func stopButtonsLoading() { - loadingRoute = .none - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowCoordinator.swift b/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowCoordinator.swift deleted file mode 100644 index 0ac4e9450b..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowCoordinator.swift +++ /dev/null @@ -1,17 +0,0 @@ -import SwiftUI - -@MainActor -protocol LoginFlowCoordinatorProtocol { - func startFlow() -> AnyView -} - -@MainActor -final class LoginFlowCoordinator: LoginFlowCoordinatorProtocol, LoginFlowOutput { - - - // MARK: - LoginFlowCoordinatorProtocol - - func startFlow() -> AnyView { - LoginDepricatedView(output: self).eraseToAnyView() - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowOutput.swift b/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowOutput.swift deleted file mode 100644 index 4e80bf1955..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginFlowOutput.swift +++ /dev/null @@ -1,5 +0,0 @@ -import SwiftUI - -@MainActor -protocol LoginFlowOutput: AnyObject { -} diff --git a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginLoadingRoute.swift b/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginLoadingRoute.swift deleted file mode 100644 index e7a3035d93..0000000000 --- a/Anytype/Sources/PresentationLayer/Auth/LoginFlow/LoginLoadingRoute.swift +++ /dev/null @@ -1,22 +0,0 @@ -enum LoginLoadingRoute { - case none - case login - case qr - case keychain - - var isLoadingInProgress: Bool { - self != .none - } - - var isLoginInProgress: Bool { - self == .login - } - - var isQRInProgress: Bool { - self == .qr - } - - var isKeychainInProgress: Bool { - self == .keychain - } -} diff --git a/Anytype/Sources/PresentationLayer/Auth/PhraseTextView/UIPhraseTextView.swift b/Anytype/Sources/PresentationLayer/Auth/PhraseTextView/UIPhraseTextView.swift index f1fb02893b..af213e90a4 100644 --- a/Anytype/Sources/PresentationLayer/Auth/PhraseTextView/UIPhraseTextView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/PhraseTextView/UIPhraseTextView.swift @@ -10,13 +10,10 @@ class UIPhraseTextView: UITextView, UITextViewDelegate { private lazy var placeholderLabel: UILabel = { let label = UILabel() label.text = Loc.Auth.LoginFlow.Textfield.placeholder - label.textColor = FeatureFlags.brandNewAuthFlow ? UIColor.Text.tertiary : UIColor.Text.primary + label.textColor = UIColor.Text.tertiary label.font = self.font label.textAlignment = self.textAlignment label.numberOfLines = 0 - if !FeatureFlags.brandNewAuthFlow { - label.layer.opacity = 0.3 - } return label }() @@ -61,10 +58,10 @@ class UIPhraseTextView: UITextView, UITextViewDelegate { autocapitalizationType = .none showsVerticalScrollIndicator = false showsHorizontalScrollIndicator = false - font = FeatureFlags.brandNewAuthFlow ? AnytypeFont.previewTitle1Regular.uiKitFont : AnytypeFont.authInput.uiKitFont - tintColor = FeatureFlags.brandNewAuthFlow ? UIColor.Control.accent100 : UIColor.Auth.inputText + font = AnytypeFont.previewTitle1Regular.uiKitFont + tintColor = UIColor.Control.accent100 textContainer.lineFragmentPadding = 0.0 - backgroundColor = FeatureFlags.brandNewAuthFlow ? UIColor.Shape.transperentSecondary : UIColor.Shape.transperentSecondary.withAlphaComponent(0.14) + backgroundColor = UIColor.Shape.transperentSecondary layer.cornerRadius = 16 layer.cornerCurve = .continuous textContentType = .password @@ -108,9 +105,9 @@ class UIPhraseTextView: UITextView, UITextViewDelegate { extension UIPhraseTextView { private func configureAttributedString(from text: String, hidden: Bool) -> NSAttributedString { - - let foregroundColor = FeatureFlags.brandNewAuthFlow ? UIColor.Text.primary : UIColor.Control.white - let anytypeFont: AnytypeFont = FeatureFlags.brandNewAuthFlow ? AnytypeFont.previewTitle1Regular : AnytypeFont.authInput + + let foregroundColor = UIColor.Text.primary + let anytypeFont: AnytypeFont = AnytypeFont.previewTitle1Regular let style = NSMutableParagraphStyle() style.lineSpacing = anytypeFont.config.lineHeight let attributes = [ diff --git a/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/AuthViewModelError.swift b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/AuthViewModelError.swift new file mode 100644 index 0000000000..c9972d6728 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/AuthViewModelError.swift @@ -0,0 +1,5 @@ +import Foundation + +enum AuthViewModelError: Error { + case unsupportedAppAction +} diff --git a/Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthOutput.swift b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthOutput.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthOutput.swift rename to Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthOutput.swift diff --git a/Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthView.swift b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthView.swift similarity index 97% rename from Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthView.swift rename to Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthView.swift index 69636614ec..8d6a9deb7f 100644 --- a/Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthView.swift +++ b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthView.swift @@ -89,7 +89,7 @@ struct PrimaryAuthView: View { StandardButton( Loc.Auth.Button.join, inProgress: model.inProgress, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.onJoinButtonTap() } @@ -97,7 +97,7 @@ struct PrimaryAuthView: View { StandardButton( Loc.Auth.logIn, - style: .secondaryOvalLarge, + style: .secondaryLarge, action: { model.onLoginButtonTap() } diff --git a/Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthViewModel.swift b/Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthViewModel.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/AuthNew/PrimaryAuthView/PrimaryAuthViewModel.swift rename to Anytype/Sources/PresentationLayer/Auth/PrimaryAuthView/PrimaryAuthViewModel.swift diff --git a/Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md b/Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md index 705973dc0e..ea77472417 100644 --- a/Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md +++ b/Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md @@ -208,6 +208,473 @@ Image(asset: .X32.plus) - `20pt` - Large spacing - `24pt` - Extra large spacing +### How to Extract Spacing from Figma + +Spacing is the **gap between elements**, not the distance between their starting positions. This is a critical distinction that's easy to get wrong. + +#### The Correct Method + +**Formula:** +``` +Spacing = NextElement.Y - (CurrentElement.Y + CurrentElement.Height) +``` + +**Step-by-Step Process:** + +1. **Select the first element** in Figma + - Note the **Y position** (top edge) + - Note the **Height** + - Calculate **bottom edge**: Y + Height + +2. **Select the second element** in Figma + - Note the **Y position** (top edge) + +3. **Calculate the spacing**: + - Spacing = Second.Y - First.BottomEdge + +#### ❌ Common Mistake: Top-to-Top Calculation + +**WRONG APPROACH:** +``` +Spacing = SecondElement.Y - FirstElement.Y // This is WRONG! +``` + +**Why this is wrong:** This calculates the distance between the *starting positions* of both elements, not the actual gap between them. You're including the height of the first element in your spacing value, which doubles the spacing. + +**Example of the mistake:** +- Title Y: 326px, Height: 24px +- Feature Y: 374px +- Wrong calculation: 374 - 326 = 48px ❌ +- This includes the title's 24px height in the "spacing"! + +#### ✅ Correct Example: Chat Empty State Spacing + +Let's extract the spacing between the title and first feature in the Chat Empty State: + +**Title Element:** "You just created a chat" +- Y position: 326px +- Height: 24px (visible in Figma inspector or annotation) +- **Bottom edge: 326 + 24 = 350px** + +**First Feature:** "Yours forever" +- Y position: 374px + +**Correct Spacing Calculation:** +``` +Spacing = 374 - 350 = 24px ✅ +``` + +This 24px is the actual gap between the bottom of the title and the top of the feature text. + +**In SwiftUI:** +```swift +Text(title) + .anytypeStyle(.bodySemibold) +Spacer.fixedHeight(24) // ✅ Correct spacing +Text(featureText) + .anytypeStyle(.previewTitle2Regular) +``` + +#### Reading Figma Spacing Annotations + +When designers add spacing annotations in Figma (e.g., the orange "24" badge in the screenshot), these show the actual gap between elements. Always trust these annotations over manual calculations. + +**If annotations are present:** +- Look for orange/red badges showing spacing values +- These are already calculated correctly +- Use the annotated value directly + +**If annotations are missing:** +- Use the formula: `NextElement.Y - (CurrentElement.Y + CurrentElement.Height)` +- Double-check your math +- Consider asking the designer to add spacing annotations + +#### Common Pitfalls to Avoid + +1. **Forgetting element height** + - Always account for the first element's height + - Height information is in Figma's inspector panel (right side) + +2. **Confusing line-height with element height** + - Text elements have both font size and line height + - Use the actual bounding box height, not just font size + +3. **Ignoring padding** + - Some elements have internal padding + - The Y position is the outer edge, but visible content may be inset + +4. **Mixing units** + - Figma shows pixels (px) + - SwiftUI uses points (pt) + - On @1x screens: 1px = 1pt (but verify for your target device) + +5. **Not verifying with annotations** + - If your calculation differs significantly from a designer's annotation, you're probably wrong + - Ask for clarification rather than assuming + +#### Quick Reference Checklist + +When extracting spacing from Figma: + +- [ ] Note the **Y position** of the first element +- [ ] Note the **Height** of the first element +- [ ] Calculate **bottom edge**: Y + Height +- [ ] Note the **Y position** of the second element +- [ ] Calculate spacing: Second.Y - First.BottomEdge +- [ ] Verify against any spacing annotations in Figma +- [ ] Convert units if necessary (px → pt) + +#### Visual Debugging + +If spacing looks wrong after implementation: + +1. **Check if text is clipping** - Your spacing may be too small +2. **Check if gap is too large** - You may have calculated top-to-top +3. **Compare side-by-side** - Take a Figma screenshot and compare with simulator +4. **Measure in simulator** - Use Xcode's View Hierarchy Debugger to measure actual spacing + +### Dimension Standards + +All dimensions in Figma designs should be **whole numbers (integers)**, not decimals. + +#### ✅ Correct Dimensions +- Y: 326px, Height: 24px +- Y: 374px, Width: 179px +- Spacing: 12px, 24px + +#### ❌ Incorrect Dimensions (Report to Design) +- Y: 484.5px ← Decimal position +- Width: 123.7px ← Fractional width +- Spacing: 18.3px ← Non-integer spacing + +#### When You Encounter Decimal Dimensions + +**What to do:** +1. **Round to the nearest integer** + - 26.5px → 27px + - 18.3px → 18px + - 484.5px → 485px + +2. **Document in implementation** + ```swift + Spacer.fixedHeight(27) // Rounded from 26.5px in Figma + ``` + +3. **Report to design team** (see section below) + +**Why this matters:** +- iOS renders on pixel-aligned boundaries +- Decimal positions can cause blurry rendering +- Indicates design inconsistency or misalignment in Figma +- Makes implementation ambiguous (should 26.5 be 26 or 27?) + +**Common causes of decimal dimensions:** +- Elements not snapped to pixel grid in Figma +- Manual positioning without grid constraints +- Rotated or transformed elements +- Copy-paste from other designs without alignment + +### Report to Design Team + +When you encounter issues during implementation, report them to the design team for improvement. This creates a feedback loop that improves design quality over time. + +#### Issues That Should Be Reported + +##### 1. Decimal/Fractional Dimensions âš ī¸ +**Issue:** Element positioned at Y: 484.5px or width: 123.7px + +**Why report:** Non-integer dimensions cause ambiguity in implementation and can result in blurry rendering on iOS. + +**Example:** +> "The button group (node 8858:18734) is positioned at Y: 484.5px. Could this be aligned to Y: 485px (or 484px) for cleaner implementation?" + +##### 2. Missing Spacing Annotations +**Issue:** No spacing annotations between elements + +**Why report:** Forces developers to manually calculate spacing, which is error-prone. + +**Example:** +> "The Chat Empty State (node 8918:18622) is missing spacing annotations between the title and features. Could you add spacing badges to clarify the intended gaps?" + +##### 3. Outdated Text Content +**Issue:** Figma shows "You just created a chat" but localization file has "Chat without the cloud" + +**Why report:** Indicates design and implementation are out of sync. + +**Example:** +> "The title text in Figma shows 'You just created a chat' but our localization key `Chat.Empty.Title` contains 'Chat without the cloud'. Which is the intended final text? Should Figma or localization be updated?" + +##### 4. Missing Typography Specifications +**Issue:** Text element doesn't have a named style (e.g., "Content/Body/Semibold") + +**Why report:** Developer must guess which font style to use. + +**Example:** +> "The feature description text (nodes 8858:18739-18741) doesn't show a typography style name in the inspector. Could you apply the 'Content/Preview Title 2/Regular' style to make this explicit?" + +##### 5. Missing Color Token Names +**Issue:** Colors shown visually but no design token specified + +**Why report:** Developer must guess which color constant to use. + +**Example:** +> "The icon color appears to be light gray but doesn't specify a color token. Should this use `Color.Control.transparentSecondary` or a different token?" + +##### 6. Incomplete State Designs +**Issue:** Only normal state designed, missing hover/pressed/disabled states + +**Why report:** Implementation may not handle all states correctly. + +**Example:** +> "The 'Add members' button only shows the normal state. Could you provide designs for pressed and disabled states, or confirm that the standard button states should be used?" + +##### 7. Elements Not Following Design System +**Issue:** Custom values instead of design system tokens + +**Why report:** Maintains design system consistency. + +**Example:** +> "The button uses a 14pt radius instead of the standard 14pt or 16pt from our corner radius system. Is this intentional or should it use a standard value?" + +#### How to Report Design Issues + +**Format:** +``` +Design Feedback: [Feature Name] + +Issue: [Brief description] +Location: [Figma file/frame/node ID] +Current State: [What's in Figma now] +Impact: [How this affects implementation] +Suggestion: [Proposed fix] + +Screenshots: [If applicable] +``` + +**Example Report:** +``` +Design Feedback: Chat Empty State + +Issue: Decimal dimensions causing implementation ambiguity +Location: Figma node 8858:18734 (Button group) +Current State: Positioned at Y: 484.5px, spacing 26.5px +Impact: Must round to nearest integers, causing potential misalignment +Suggestion: Align to Y: 485px and spacing to 27px for pixel-perfect implementation +``` + +#### When NOT to Report + +Don't report issues that are: +- **Subjective preferences** - "I think the button should be blue" +- **Implementation challenges** - "This is hard to code" (that's our job!) +- **Already discussed** - Check with team first to avoid duplicate reports +- **Within tolerances** - 0.5px differences that are unavoidable due to math + +#### Best Practices for Design Feedback + +1. **Be specific** - Include exact node IDs, dimensions, and locations +2. **Be constructive** - Suggest fixes, don't just complain +3. **Be collaborative** - Frame as questions, not demands +4. **Batch similar issues** - One report with multiple related items vs. many small reports +5. **Include context** - Explain *why* it matters for implementation +6. **Respect design decisions** - If designer confirms it's intentional, accept it + +### Common Verification Mistakes to Avoid + +When reviewing designs against implementation, avoid these lazy verification patterns that lead to incorrect assessments. + +#### 1. ❌ Assuming Data is Missing Instead of Checking + +**The Mistake:** + +Claiming that specifications are "missing" or "not provided" without actually verifying the Figma data first. + +**Real Examples from Design Reviews:** + +**Example 1: Button Spacing** +- ❌ **WRONG**: "Button spacing seems reasonable. Without explicit Figma annotations, this is acceptable." +- ✅ **CORRECT**: + - Check Figma data: Button 1 at X: 80, Width: 111 → Right edge: 191 + - Button 2 at X: 199 → Left edge: 199 + - Calculate: 199 - 191 = **8px** ✅ + - Verify implementation uses `spacing: 8` ✅ + +**Example 2: Icon Color** +- ❌ **WRONG**: "Icon color seems appropriate. Without explicit color tokens in design, this is acceptable choice." +- ✅ **CORRECT**: + - Check Figma inspector panel + - See "Control/Transparent Secondary" explicitly specified + - Verify implementation: `Color.Control.transparentSecondary` ✅ + +**Why This is a Problem:** + +- You're making assumptions instead of doing verification +- "Acceptable given missing specs" is often an excuse for laziness +- The data usually EXISTS in Figma - you just didn't look for it +- This leads to incorrect "verified" claims + +**Correct Verification Process:** + +1. **Check Figma inspector panel first** + - Look at the right sidebar when element is selected + - Colors, typography, dimensions are all listed there + +2. **Check Figma data structure** + - Review the design context data you fetched + - Look for X/Y positions, widths, heights + - Check for color variable names + +3. **Calculate from positions if needed** + - Horizontal spacing: `NextElement.X - (CurrentElement.X + CurrentElement.Width)` + - Vertical spacing: `NextElement.Y - (CurrentElement.Y + CurrentElement.Height)` + +4. **Only say "missing" if truly absent** + - After checking inspector + - After checking design context data + - After asking designer if still unclear + +5. **NEVER use "acceptable given missing specs"** + - This is a red flag for lazy verification + - Either verify it's correct OR mark it as needing investigation + - Don't mark unverified items as "acceptable" + +#### 2. ❌ Not Applying Your Own Spacing Formula + +**The Mistake:** + +You know the correct spacing formula but don't consistently apply it to verify every spacing value. + +**Real Example:** + +In the same review where I documented the spacing formula, I later: +- Correctly calculated title → feature spacing (24px) ✅ +- But then said button spacing was "reasonable without annotations" ❌ +- Instead of applying the same X-axis formula to verify it + +**Why This is a Problem:** + +- Inconsistent methodology +- Some spacing values get verified, others get hand-waved +- Undermines the value of the formula you just documented + +**Correct Process:** + +For EVERY spacing value in the design review: + +1. **Identify the two elements** +2. **Get positions and dimensions** from Figma data +3. **Apply the formula**: + - Vertical: `NextElement.Y - (CurrentElement.Y + CurrentElement.Height)` + - Horizontal: `NextElement.X - (CurrentElement.X + CurrentElement.Width)` +4. **Compare to implementation** +5. **Mark as ✅ correct or ❌ mismatch** + +Never skip the calculation just because it "looks about right." + +#### 3. ❌ Confusing Dimensions vs Spacing + +**The Mistake:** + +Misinterpreting what Figma annotations are measuring - width/height vs spacing. + +**Real Example:** + +Figma screenshot shows: +- Orange badge "26" - This is WIDTH (X dimension) +- Orange badge "24" - This is HEIGHT (Y dimension) + +Initial confusion: +- ❌ "I calculate 24px but screenshot shows 26" +- Reality: 26 is width, 24 is height - different measurements! +- ✅ Spacing is 24px, title height is 24px, title width is 179px (the "26" was misleading) + +**Why This Happens:** + +- Multiple orange/red badges in Figma can be confusing +- Some show dimensions (width/height) +- Some show spacing (gaps) +- Some show positions (X/Y coordinates) + +**How to Avoid:** + +1. **Look at annotation placement** + - Horizontal badge on element = width + - Vertical badge on element = height + - Badge between elements = spacing + +2. **Check annotation lines** + - Solid line to element edges = dimension + - Dashed line between elements = spacing + +3. **Verify with calculation** + - If annotation doesn't match your calculation, figure out what it's measuring + - Don't assume it's spacing without checking + +4. **When in doubt, ask designer** + - "The '26' annotation - is this width or spacing?" + +#### 4. ❌ Marking Items as "Low Priority" to Avoid Verification + +**The Mistake:** + +Labeling something "low priority" or "acceptable" to skip proper verification. + +**Why This is Wrong:** + +- Priority should be based on USER IMPACT, not verification difficulty +- Icon color being wrong is NOT low priority - users see it immediately +- Button spacing being wrong is NOT low priority - affects the entire layout + +**Correct Prioritization:** + +- **High Priority**: User-facing elements (text, colors, spacing users notice) +- **Medium Priority**: Edge cases, states, less visible elements +- **Low Priority**: Internal implementation details with no visual impact + +Don't use priority as an excuse to skip verification work. + +#### 5. ❌ Not Using Available Figma Data + +**The Mistake:** + +Saying "can't verify" when the data is right there in the Figma response. + +**What You Have Access To:** + +From `get_design_context` and `get_screenshot`: +- Element positions (X, Y) +- Element dimensions (Width, Height) +- Color variables (in inspector) +- Typography styles (in inspector) +- Element hierarchy +- Layer names +- Node IDs + +**If You Don't Have It:** + +- Call `get_design_context` with specific node ID +- Check the screenshot for inspector panel +- Look at the exported code for color/font details + +**Only say "missing" if:** +- You've checked all available Figma data +- You've looked at inspector panels +- You've checked annotations in screenshots +- It's genuinely not specified anywhere + +#### Quick Self-Check Before Claiming "Missing" or "Acceptable" + +Ask yourself: + +- [ ] Did I check the Figma inspector panel? +- [ ] Did I check the design context data? +- [ ] Did I look at annotations in screenshots? +- [ ] Did I calculate using the position/dimension data? +- [ ] Did I apply the spacing formula? +- [ ] Am I being lazy and assuming instead of verifying? + +If you answered "no" to any of these, **go back and verify properly** instead of marking it "acceptable." + ### Corner Radius Standards - `10pt` - Standard corner radius (search bars, cards) - `20pt` - Large corner radius (buttons, major UI elements) diff --git a/Anytype/Sources/PresentationLayer/Common/Extensions/RelationValuesProtocol+PageCellTitle.swift b/Anytype/Sources/PresentationLayer/Common/Extensions/RelationValuesProtocol+PageCellTitle.swift index b76372293a..bbdbcc5d4e 100644 --- a/Anytype/Sources/PresentationLayer/Common/Extensions/RelationValuesProtocol+PageCellTitle.swift +++ b/Anytype/Sources/PresentationLayer/Common/Extensions/RelationValuesProtocol+PageCellTitle.swift @@ -41,6 +41,6 @@ extension BundledPropertiesValueProvider { } var mentionTitle: String { - String(pluralTitle.prefix(30)).replacingOccurrences(of: "\n", with: " ") + String(pluralTitle.prefix(30)).replacing("\n", with: " ") } } diff --git a/Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md b/Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md new file mode 100644 index 0000000000..c6cd73b81a --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md @@ -0,0 +1,313 @@ +# Localization System Guide + +Complete guide to the Anytype iOS localization system using SwiftGen and .xcstrings files. + +*Last updated: 2025-01-30* + +## Overview + +The Anytype iOS app uses a 3-file localization system with SwiftGen code generation: +- **Auth.xcstrings** (86 keys): Authentication, login/join flows, keychain, vault, onboarding, migration +- **Workspace.xcstrings** (493 keys): Spaces, objects, relations, collections, sets, types, templates, collaboration +- **UI.xcstrings** (667 keys): Settings, widgets, alerts, common UI elements, general app strings + +All three files generate into a single `Strings.swift` file (~5,000 lines) with type-safe constants. + +## âš ī¸ CRITICAL RULES + +1. **NEVER use hardcoded strings in UI** - Always use localization constants +2. **Keys must be unique across ALL three .xcstrings files** - Duplicate keys break code generation +3. **Only update English (`en`) translations** - All other languages handled by Crowdin +4. **Always run `make generate` after changes** - Regenerates Strings.swift constants + +## 📋 Quick Workflow + +### 1. Search Existing Keys First + +```bash +rg "yourSearchTerm" Modules/Loc/Sources/Loc/Generated/Strings.swift +``` + +**Use existing patterns**: +- Block titles: `[feature]BlockTitle` +- Block subtitles: `[feature]BlockSubtitle` +- Common words: `camera`, `photo`, `picture`, `video(1)` + +### 2. Choose the Right .xcstrings File + +| File | Count | Use For | +|------|-------|---------| +| **Auth.xcstrings** | 86 keys | Authentication, login/join flows, keychain, vault, onboarding, migration | +| **Workspace.xcstrings** | 493 keys | Spaces, objects, relations, collections, sets, types, templates, collaboration | +| **UI.xcstrings** | 667 keys | Settings, widgets, alerts, common UI elements, general app strings | + +### 3. Add Key (If Doesn't Exist) + +**Location**: `Modules/Loc/Sources/Loc/Resources/[File].xcstrings` + +**Format**: +```json +"Your localization key" : { + "extractionState" : "manual", + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Your English text here" + } + } + } +} +``` + +**âš ī¸ IMPORTANT**: Only edit the `"en"` (English) translation. Do not manually edit translations for other languages (de, es, fr, ja, etc.) - the localization team manages non-English translations through Crowdin workflow. + +### 4. Generate Constants + +```bash +make generate +``` + +This runs SwiftGen to generate type-safe constants in `Modules/Loc/Sources/Loc/Generated/Strings.swift`. + +### 5. Use in Code + +```swift +import Loc + +// Simple text +AnytypeText(Loc.yourLocalizationKey, style: .uxCalloutMedium) + +// Or with Text +Text(Loc.yourLocalizationKey) + .anytypeStyle(.bodyRegular) +``` + +## 🔤 Key Naming Patterns + +### Short, Descriptive Keys + +✅ **CORRECT**: `"No properties yet"` +❌ **WRONG**: `"No properties yet. Add some to this type."` + +**Why**: Keys should be concise. Full sentences belong in the value, not the key name. + +### Hierarchical Organization + +Use dots for organization. SwiftGen creates nested enums: + +**Input** (in .xcstrings): +```json +"QR.join.title": { "en": "Join with QR" } +"QR.join.subtitle": { "en": "Scan code to join" } +``` + +**Generated** (in Strings.swift): +```swift +enum Loc { + enum Qr { + enum Join { + static let title = "Join with QR" + static let subtitle = "Scan code to join" + } + } +} +``` + +**Usage**: +```swift +Text(Loc.Qr.Join.title) +Text(Loc.Qr.Join.subtitle) +``` + +## 🔧 Dynamic Localization (with Parameters) + +For strings with format specifiers (%lld, %d, %@), SwiftGen automatically generates functions with parameters. + +### Format Specifiers + +| Specifier | Type | Example | +|-----------|------|---------| +| `%lld` | Integer (long long) | "You've reached the limit of %lld editors" | +| `%d` | Integer | "Pin limit reached: %d pinned spaces" | +| `%@` | String | "Hello %@" | +| `%f` | Float/Double | "Progress: %.2f%%" | + +### Example + +**Input** (Workspace.xcstrings): +```json +"You've reached the limit of %lld editors": { + "localizations": { + "en": { + "stringUnit": { + "state": "translated", + "value": "You've reached the limit of %lld editors" + } + } + } +} +``` + +**Generated** (Strings.swift): +```swift +static func youVeReachedTheLimitOfEditors(_ value: Int) -> String { + return String(format: "You've reached the limit of %lld editors", value) +} +``` + +**Usage**: + +✅ **CORRECT** - Use generated function: +```swift +Text(Loc.youVeReachedTheLimitOfEditors(4)) +``` + +❌ **WRONG** - Don't use String(format:): +```swift +String(format: Loc.youVeReachedTheLimitOfEditors, 4) // Compile error! +``` + +**Why**: SwiftGen generates type-safe functions. Always use the generated function directly. + +## đŸ—‘ī¸ Removing Unused Localization Keys + +When removing code that uses localization keys, clean up the .xcstrings files: + +### Workflow + +**1. Search for usage**: +```bash +rg "keyName" --type swift +``` + +**2. If only found in Generated/Strings.swift**, the key is unused: +- Remove the entire key entry from the source `.xcstrings` file +- Run `make generate` to regenerate Strings.swift + +**3. Example**: +- Removed `MembershipParticipantUpgradeReason.numberOfSpaceReaders` from code +- Search: `rg "noMoreMembers" --type swift` → only in Strings.swift +- Remove `"Membership.Upgrade.NoMoreMembers"` from Workspace.xcstrings +- Run `make generate` + +**Important**: Never leave orphaned localization keys in .xcstrings files - they bloat the codebase and confuse translators. + +## 📁 File Locations + +- **Source .xcstrings files**: `Modules/Loc/Sources/Loc/Resources/` + - Auth.xcstrings + - Workspace.xcstrings + - UI.xcstrings +- **Generated constants**: `Modules/Loc/Sources/Loc/Generated/Strings.swift` +- **SwiftGen config**: `Modules/Loc/swiftgen.yml` + +## 🎓 Common Mistakes + +### ❌ Using String(format:) + +```swift +// WRONG +String(format: Loc.someKey, value) + +// CORRECT +Loc.someKey(value) +``` + +### ❌ Hardcoded Strings + +```swift +// WRONG +Text("Add Member") + +// CORRECT +Text(Loc.addMember) +``` + +### ❌ Duplicate Keys Across Files + +```swift +// If "Settings.Title" exists in both UI.xcstrings and Workspace.xcstrings +// → make generate will fail +``` + +**Solution**: Keys must be globally unique across all 3 files. + +### ❌ Forgetting to Generate + +```bash +# After adding key to .xcstrings +# WRONG: Try to use immediately +Text(Loc.myNewKey) // Error: unresolved identifier + +# CORRECT: Generate first +make generate +Text(Loc.myNewKey) // Success! +``` + +### ❌ Editing Non-English Translations + +```json +// WRONG - Don't edit other languages +"localizations": { + "en": { ... }, + "de": { "value": "Meine Übersetzung" } // Don't do this! +} + +// CORRECT - Only edit English +"localizations": { + "en": { "value": "My translation" } + // Crowdin handles other languages +} +``` + +## 🔍 Troubleshooting + +### Issue: Key not generating + +**Symptom**: Added key to .xcstrings but `Loc.myKey` doesn't exist + +**Solution**: +1. Check JSON syntax is valid: `jq . Modules/Loc/Sources/Loc/Resources/UI.xcstrings` +2. Verify key doesn't exist in other files (duplicate keys break generation) +3. Run `make generate` +4. Check for errors in generation output + +### Issue: Duplicate key error + +**Symptom**: `make generate` fails with duplicate key error + +**Solution**: +```bash +# Find duplicates across all files +rg "\"My Key\"" Modules/Loc/Sources/Loc/Resources/*.xcstrings + +# Should appear only once total across all 3 files +``` + +### Issue: Format specifier not working + +**Symptom**: `Loc.myKey(value)` doesn't exist, only `Loc.myKey` (string) + +**Solution**: Check the .xcstrings value includes format specifier: +- With `%lld` or `%d` → generates function with Int parameter +- Without format specifier → generates plain string constant + +## 📚 Additional Resources + +- **Quick Reference**: See CLAUDE.md for condensed workflow +- **Skills System**: `.claude/skills/localization-developer/` for auto-activation +- **SwiftGen Docs**: https://github.com/SwiftGen/SwiftGen + +## 💡 Best Practices + +1. **Search before adding** - Reuse existing keys when possible +2. **Use hierarchical naming** - `Feature.Section.Item` for organization +3. **Keep keys short** - Full text goes in value, not key name +4. **Clean up unused keys** - Prevents bloat and translator confusion +5. **Only edit English** - Let Crowdin handle other languages +6. **Always generate** - Run `make generate` after any .xcstrings change + +--- + +*This guide is the single source of truth for localization. For quick reference, see CLAUDE.md.* \ No newline at end of file diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Alerts/AlertView.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Alerts/AlertView.swift index 80817d3038..34be88d0cd 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Alerts/AlertView.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Alerts/AlertView.swift @@ -26,7 +26,7 @@ struct AlertView: View where Presenting: View { StandardButton( Loc.ok, - style: .secondaryOvalLarge, + style: .secondaryLarge, action: { isShowing.toggle() onButtonTap() diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/IconView/Specific/Object/TodoIconView.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/IconView/Specific/Object/TodoIconView.swift index fc3d5d37c3..36b91baff4 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/IconView/Specific/Object/TodoIconView.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/IconView/Specific/Object/TodoIconView.swift @@ -5,9 +5,7 @@ import Services struct TodoIconView: View { private static let maxSide = 28.0 - - @Injected(\.objectActionsService) - private var objectActionsService: any ObjectActionsServiceProtocol + @State private var model = TodoIconViewModel() let checked: Bool let objectId: String? @@ -20,10 +18,22 @@ struct TodoIconView: View { .frame(maxWidth: 28, maxHeight: 28) .onTapGesture { guard let objectId else { return } - Task { - try await objectActionsService.updateBundledDetails(contextID: objectId, details: [.done(!checked)]) - UIImpactFeedbackGenerator(style: .rigid).impactOccurred() - } + model.updateDone(objectId: objectId, checked: !checked) } } } + +@MainActor +@Observable +private final class TodoIconViewModel { + + @Injected(\.objectActionsService) @ObservationIgnored + private var objectActionsService: any ObjectActionsServiceProtocol + + func updateDone(objectId: String, checked: Bool) { + Task { + try await objectActionsService.updateBundledDetails(contextID: objectId, details: [.done(checked)]) + UIImpactFeedbackGenerator(style: .rigid).impactOccurred() + } + } +} diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Date/PropertyCalendarViewModel.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Date/PropertyCalendarViewModel.swift index 47812eb68c..5a24ac1938 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Date/PropertyCalendarViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Date/PropertyCalendarViewModel.swift @@ -54,8 +54,7 @@ final class PropertyCalendarViewModel: ObservableObject { isEmpty: value.isZero, format: relationDetails.format, type: config.analyticsType, - key: relationDetails.analyticsKey, - spaceId: config.spaceId + key: relationDetails.analyticsKey ) } } diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/PropertySelectedOptions/PropertySelectedOptionsModel.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/PropertySelectedOptions/PropertySelectedOptionsModel.swift index 1abcd9399c..a8004621e6 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/PropertySelectedOptions/PropertySelectedOptionsModel.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/PropertySelectedOptions/PropertySelectedOptionsModel.swift @@ -83,8 +83,7 @@ final class PropertySelectedOptionsModel: PropertySelectedOptionsModelProtocol { isEmpty: selectedOptionsIds.isEmpty, format: relationDetails.format, type: config.analyticsType, - key: relationDetails.analyticsKey, - spaceId: config.spaceId + key: relationDetails.analyticsKey ) } } diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyDetailsService/TextPropertyEditingService.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyDetailsService/TextPropertyEditingService.swift index 4e95c82a76..832bca64bc 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyDetailsService/TextPropertyEditingService.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyDetailsService/TextPropertyEditingService.swift @@ -22,7 +22,7 @@ final class TextPropertyEditingService: TextPropertyEditingServiceProtocol, Send guard let number = numberFormatter.number(from: value)?.doubleValue else { return } try await service.updateProperty(objectId: objectId, propertyKey: key, value: number.protobufValue) case .phone, .email, .url: - let value = value.replacingOccurrences(of: " ", with: "") + let value = value.replacing(" ", with: "") try await service.updateProperty(objectId: objectId, propertyKey: key, value: value.protobufValue) } } diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyEditingViewModel.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyEditingViewModel.swift index 14b3d1a041..ce5f379383 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyEditingViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/PropertyDetailsViews/Text/TextPropertyEditingViewModel.swift @@ -120,8 +120,7 @@ final class TextPropertyEditingViewModel: ObservableObject { isEmpty: text.isEmpty, format: relationDetails.format, type: config.analyticsType, - key: relationDetails.analyticsKey, - spaceId: config.spaceId + key: relationDetails.analyticsKey ) } } diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/GlobalSearchViewModel.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/GlobalSearchViewModel.swift index 7308220d9b..480b6d7be6 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/GlobalSearchViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/GlobalSearchViewModel.swift @@ -18,7 +18,9 @@ final class GlobalSearchViewModel: ObservableObject { private var accountParticipantStorage: any ParticipantsStorageProtocol @Injected(\.objectActionsService) private var objectActionService: any ObjectActionsServiceProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + private let moduleData: GlobalSearchModuleData private let dateFormatter = AnytypeRelativeDateTimeFormatter() @@ -28,6 +30,7 @@ final class GlobalSearchViewModel: ObservableObject { @Published var dismiss = false @Published private var participantCanEdit = false + private var spaceUxType: SpaceUxType? private var searchResult = [SearchResultWithMeta]() private var sectionChanged = false var isInitial = true @@ -35,10 +38,11 @@ final class GlobalSearchViewModel: ObservableObject { init(data: GlobalSearchModuleData) { self.moduleData = data self.restoreState() + self.loadSpaceUxType() } func startParticipantTask() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: moduleData.spaceId).values { + for await participant in accountParticipantStorage.participantSequence(spaceId: moduleData.spaceId) { participantCanEdit = participant.canEdit updateSections() } @@ -76,7 +80,7 @@ final class GlobalSearchViewModel: ObservableObject { } func onSearchTextChanged() { - AnytypeAnalytics.instance().logSearchInput(spaceId: moduleData.spaceId) + AnytypeAnalytics.instance().logSearchInput() } func onKeyboardButtonTap() { @@ -85,7 +89,7 @@ final class GlobalSearchViewModel: ObservableObject { } func onSelect(searchData: SearchWithMetaModel) { - AnytypeAnalytics.instance().logSearchResult(spaceId: moduleData.spaceId, objectType: state.section.analyticsValue) + AnytypeAnalytics.instance().logSearchResult(objectType: state.section.analyticsValue) dismiss.toggle() moduleData.onSelect(searchData.editorScreenData) } @@ -97,6 +101,10 @@ final class GlobalSearchViewModel: ObservableObject { UISelectionFeedbackGenerator().selectionChanged() } + private func loadSpaceUxType() { + spaceUxType = spaceViewsStorage.spaceView(spaceId: moduleData.spaceId)?.uxType + } + private func updateSections() { guard searchResult.isNotEmpty else { sections = [] @@ -133,12 +141,12 @@ final class GlobalSearchViewModel: ObservableObject { private func restoreState() { let restoredState = globalSearchSavedStatesService.restoreState(for: moduleData.spaceId) guard let restoredState else { - AnytypeAnalytics.instance().logScreenSearch(spaceId: moduleData.spaceId, type: .empty) + AnytypeAnalytics.instance().logScreenSearch(type: .empty) return } state = restoredState if restoredState.searchText.isNotEmpty { - AnytypeAnalytics.instance().logScreenSearch(spaceId: moduleData.spaceId, type: .saved) + AnytypeAnalytics.instance().logScreenSearch(type: .saved) } } @@ -161,11 +169,11 @@ final class GlobalSearchViewModel: ObservableObject { } private func buildLayouts() -> [DetailsLayout] { - .builder { + return .builder { if state.searchText.isEmpty { - state.section.supportedLayouts.filter { $0 != .participant } + state.section.supportedLayouts(spaceUxType: spaceUxType).filter { $0 != .participant } } else { - state.section.supportedLayouts + state.section.supportedLayouts(spaceUxType: spaceUxType) } } } diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/Models/ObjectTypeSection.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/Models/ObjectTypeSection.swift index 02ca1b9087..b1978f9a3f 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/Models/ObjectTypeSection.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/GlobalSearch/Models/ObjectTypeSection.swift @@ -34,10 +34,10 @@ enum ObjectTypeSection: String, CaseIterable, Codable { } } - var supportedLayouts: [DetailsLayout] { + func supportedLayouts(spaceUxType: SpaceUxType?) -> [DetailsLayout] { switch self { case .all: - DetailsLayout.visibleLayoutsWithFiles + DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType) case .pages: DetailsLayout.editorLayouts case .lists: diff --git a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/ObjectSearchWithMeta/ObjectSearchWithMetaViewModel.swift b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/ObjectSearchWithMeta/ObjectSearchWithMetaViewModel.swift index 24a65a7819..33ed4c6734 100644 --- a/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/ObjectSearchWithMeta/ObjectSearchWithMetaViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Common/SwiftUI/Search/ObjectSearchWithMeta/ObjectSearchWithMetaViewModel.swift @@ -11,7 +11,9 @@ final class ObjectSearchWithMetaViewModel: ObservableObject { private var searchWithMetaService: any SearchWithMetaServiceProtocol @Injected(\.searchWithMetaModelBuilder) private var searchWithMetaModelBuilder: any SearchWithMetaModelBuilderProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + private let dateFormatter = AnytypeRelativeDateTimeFormatter() @Published var searchText = "" @@ -36,7 +38,7 @@ final class ObjectSearchWithMetaViewModel: ObservableObject { searchResult = try await searchWithMetaService.search( text: searchText, spaceId: moduleData.spaceId, - layouts: ObjectSearchWithMetaModuleData.supportedLayouts, + layouts: supportedLayouts(), sorts: buildSorts(), excludedObjectIds: moduleData.excludedObjectIds ) @@ -50,7 +52,7 @@ final class ObjectSearchWithMetaViewModel: ObservableObject { sections = [] } - AnytypeAnalytics.instance().logSearchInput(spaceId: moduleData.spaceId) + AnytypeAnalytics.instance().logSearchInput() } func onSelect(searchData: SearchWithMetaModel) { @@ -109,9 +111,10 @@ final class ObjectSearchWithMetaViewModel: ObservableObject { ) } } -} -extension ObjectSearchWithMetaModuleData { - static let supportedLayouts: [DetailsLayout] = - ObjectTypeSection.pages.supportedLayouts + ObjectTypeSection.lists.supportedLayouts + private func supportedLayouts() -> [DetailsLayout] { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: moduleData.spaceId)?.uxType + return ObjectTypeSection.pages.supportedLayouts(spaceUxType: spaceUxType) + + ObjectTypeSection.lists.supportedLayouts(spaceUxType: spaceUxType) + } } diff --git a/Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md b/Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md new file mode 100644 index 0000000000..f9b9505722 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md @@ -0,0 +1,233 @@ +# Figma to Swift Typography Mapping + +This document maps Figma text style names to Swift `AnytypeFont` enum cases. + +## Mapping Rules + +### Content Styles (ALWAYS remove "Content/" prefix) +- "Content/Body/Semibold" → `.bodySemibold` +- "Content/Preview Title 2/Regular" → `.previewTitle2Regular` +- "Content/Relation 3/Regular" → `.relation3Regular` + +### UX Styles - Title, Body, Callout (KEEP "ux" prefix as lowercase) +- "UX/Title 1/Semibold" → `.uxTitle1Semibold` +- "UX/Title 2/Medium" → `.uxTitle2Medium` +- "UX/Body/Regular" → `.uxBodyRegular` +- "UX/Callout/Medium" → `.uxCalloutMedium` + +### UX Styles - Captions (DROP "ux" prefix - EXCEPTION!) +- "UX/Caption 1/Medium" → `.caption1Medium` (no "ux") +- "UX/Caption 2/Regular" → `.caption2Regular` (no "ux") + +## Complete Mapping Table + +| Figma Style Name | Swift Constant | Size | Weight | Line Height | Letter Spacing | +|------------------|----------------|------|--------|-------------|----------------| +| **Content Styles** | +| Content/Title | `.title` | 28pt | Bold | 34pt | -0.36px | +| Content/Heading | `.heading` | 22pt | Semibold | 28pt | -0.26px | +| Content/Subheading | `.subheading` | 20pt | Semibold | 26pt | -0.45px | +| Content/Preview Title 1/Medium | `.previewTitle1Medium` | 17pt | Medium | 22pt | -0.41px | +| Content/Preview Title 1/Regular | `.previewTitle1Regular` | 17pt | Regular | 22pt | -0.41px | +| **Content/Preview Title 2/Regular** | **`.previewTitle2Regular`** | **15pt** | **Regular (400)** | **20pt** | **-0.24px** | +| **Content/Preview Title 2/Medium** | **`.previewTitle2Medium`** | **15pt** | **Medium (500)** | **20pt** | **-0.24px** | +| Content/Body/Regular | `.bodyRegular` | 17pt | Regular | 24pt | -0.41px | +| **Content/Body/Semibold** | **`.bodySemibold`** | **17pt** | **Semibold (600)** | **24pt** | **-0.41px** | +| Content/Callout/Regular | `.calloutRegular` | 16pt | Regular | 21pt | -0.32px | +| Content/Relation 1/Regular | `.relation1Regular` | 13pt | Regular | 18pt | -0.08px | +| Content/Relation 2/Regular | `.relation2Regular` | 13pt | Regular | 16pt | 0px | +| Content/Relation 3/Regular | `.relation3Regular` | 12pt | Regular | 15pt | 0px | +| **UX Styles (with "ux" prefix)** | +| UX/Title 1/Semibold | `.uxTitle1Semibold` | 28pt | Semibold | 34pt | -0.36px | +| UX/Title 2/Semibold | `.uxTitle2Semibold` | 17pt | Semibold | 22pt | -0.43px | +| UX/Title 2/Regular | `.uxTitle2Regular` | 17pt | Regular | 22pt | -0.43px | +| UX/Title 2/Medium | `.uxTitle2Medium` | 17pt | Medium | 22pt | -0.43px | +| UX/Body/Regular | `.uxBodyRegular` | 17pt | Regular | 22pt | -0.43px | +| UX/Callout/Regular | `.uxCalloutRegular` | 16pt | Regular | 21pt | -0.32px | +| UX/Callout/Medium | `.uxCalloutMedium` | 16pt | Medium | 21pt | -0.32px | +| **UX Styles (Captions - NO "ux" prefix)** | +| **UX/Caption 1/Medium** | **`.caption1Medium`** | **13pt** | **Medium (500)** | **18pt** | **-0.08px** | +| UX/Caption 1/Regular | `.caption1Regular` | 13pt | Regular | 18pt | -0.08px | +| UX/Caption 1/Semibold | `.caption1Semibold` | 13pt | Semibold | 18pt | -0.08px | +| UX/Caption 2/Medium | `.caption2Medium` | 11pt | Medium | 13pt | 0.06px | +| UX/Caption 2/Regular | `.caption2Regular` | 11pt | Regular | 13pt | 0.06px | +| UX/Caption 2/Semibold | `.caption2Semibold` | 11pt | Semibold | 13pt | 0.06px | +| **Special Styles** | +| Chat/Text | `.chatText` | 17pt | Regular | 24pt | -0.41px | +| Chat/Preview/Medium | `.chatPreviewMedium` | 15pt | Medium | 20pt | -0.24px | +| Chat/Preview/Regular | `.chatPreviewRegular` | 15pt | Regular | 20pt | -0.24px | +| Content/Code Block | `.codeBlock` | 16pt | Regular | 21pt | -0.32px | + +## How to Use This Mapping + +### Step 1: Get Figma Typography Info +In Figma, select the text element and check the "Typography" panel on the right. Look for the "Name" field, which shows the style name (e.g., "Content/Body/Semibold"). + +### Step 2: Map to Swift Constant +Use the table above to find the corresponding Swift constant: +- "Content/Body/Semibold" → `.bodySemibold` +- "Content/Preview Title 2/Regular" → `.previewTitle2Regular` +- "UX/Caption 1/Medium" → `.caption1Medium` (note: drops "ux") + +### Step 3: Apply in SwiftUI +```swift +// Using Text with .anytypeStyle() +Text("Hello World") + .anytypeStyle(.bodySemibold) + +// Using AnytypeText +AnytypeText("Hello World", style: .previewTitle2Regular) +``` + +## Common Mistakes to Avoid + +### ❌ WRONG: Using relation styles for 15pt text +```swift +// Feature descriptions should be 15pt +Text("Yours forever") + .anytypeStyle(.relation3Regular) // 12pt - TOO SMALL! +``` + +### ✅ CORRECT: Using preview title styles for 15pt text +```swift +// Feature descriptions at 15pt +Text("Yours forever") + .anytypeStyle(.previewTitle2Regular) // 15pt - CORRECT! +``` + +### ❌ WRONG: Guessing style names +```swift +// Don't guess or make up style names +.anytypeStyle(.bodyMedium) // Doesn't exist! +.anytypeStyle(.preview2) // Incomplete name! +.anytypeStyle(.uxCaption1Medium) // Caption styles don't have "ux" prefix! +``` + +### ✅ CORRECT: Use exact enum case names +```swift +// Use complete, exact enum case names +.anytypeStyle(.previewTitle2Medium) // Correct! +.anytypeStyle(.bodySemibold) // Correct! +.anytypeStyle(.caption1Medium) // Correct! (no "ux" prefix) +``` + +### ❌ WRONG: Confusing UX prefix rules +```swift +// Caption styles don't use "ux" prefix +.anytypeStyle(.uxCaption1Medium) // Doesn't exist! + +// But Title/Body/Callout DO use "ux" prefix +.anytypeStyle(.title2Medium) // Wrong! Should be .uxTitle2Medium +``` + +### ✅ CORRECT: Understanding UX prefix rules +```swift +// Caption styles: NO "ux" prefix +.anytypeStyle(.caption1Medium) // Correct! + +// Title/Body/Callout: YES "ux" prefix +.anytypeStyle(.uxTitle2Medium) // Correct! +.anytypeStyle(.uxBodyRegular) // Correct! +.anytypeStyle(.uxCalloutMedium) // Correct! +``` + +## Quick Reference: Most Common Styles + +### Content Text +- **Title/Heading**: `.title` (28pt), `.heading` (22pt), `.subheading` (20pt) +- **Body Text**: `.bodyRegular` (17pt), `.bodySemibold` (17pt) +- **Preview/Object Titles**: + - 17pt: `.previewTitle1Regular`, `.previewTitle1Medium` + - 15pt: `.previewTitle2Regular`, `.previewTitle2Medium` ⭐ +- **Descriptions**: + - 13pt: `.relation1Regular`, `.relation2Regular` + - 12pt: `.relation3Regular` + +### UI Elements +- **Titles**: `.uxTitle1Semibold` (28pt), `.uxTitle2Medium` (17pt) +- **Body**: `.uxBodyRegular` (17pt) +- **Captions/Labels**: `.caption1Medium` (13pt), `.caption2Regular` (11pt) ⭐ + +### Chat-Specific +- **Messages**: `.chatText` (17pt) +- **Previews**: `.chatPreviewMedium` (15pt) + +⭐ = Commonly confused or misused + +## Size Quick Reference + +Need to find the right style by size? + +| Size | Available Styles | +|------|------------------| +| 28pt | `.title`, `.uxTitle1Semibold` | +| 22pt | `.heading`, `.uxTitle2Semibold/Regular/Medium` | +| 20pt | `.subheading` | +| 17pt | `.previewTitle1*`, `.bodyRegular/Semibold`, `.uxTitle2*`, `.uxBodyRegular`, `.chatText` | +| 16pt | `.calloutRegular`, `.uxCalloutRegular/Medium`, `.codeBlock` | +| **15pt** | **`.previewTitle2Regular/Medium`**, `.chatPreviewMedium/Regular` | +| 13pt | `.relation1Regular`, `.relation2Regular`, `.caption1Semibold/Regular/Medium` | +| 12pt | `.relation3Regular` | +| 11pt | `.caption2Semibold/Regular/Medium` | + +## Design Review Checklist + +When reviewing Figma designs against implementation: + +1. ✅ Check Typography panel for each text element in Figma +2. ✅ Verify the "Name" field shows a style (e.g., "Content/Body/Semibold") +3. ✅ Map Figma style name to Swift constant using this document +4. ✅ Verify size, weight, and line height match between Figma and Swift definition +5. ✅ Watch for caption styles - they drop the "ux" prefix +6. ✅ Update implementation if mismatch found + +## Real-World Example: Chat Empty State + +### Design Specifications (from Figma) +- **Title**: "You just created a chat" - `Content/Body/Semibold` (17pt, 600, 24pt) +- **Features**: "Yours forever", etc. - `Content/Preview Title 2/Regular` (15pt, 400, 20pt) +- **Buttons**: "Add members" - `UX/Caption 1/Medium` (13pt, 500, 18pt) + +### Correct Implementation +```swift +// Title +Text(Loc.Chat.Empty.title) + .anytypeStyle(.bodySemibold) // ✅ Correct: 17pt/600/24 + +// Feature descriptions +Text(Loc.Chat.Empty.Feature.yoursForever) + .anytypeStyle(.previewTitle2Regular) // ✅ Correct: 15pt/400/20 + +// Button text (handled by StandardButton component) +StandardButton(Loc.Chat.Empty.Button.addMembers, style: .primaryXSmall) +// .primaryXSmall uses .caption1Medium internally ✅ +``` + +### Common Mistakes in This Example +```swift +// ❌ WRONG: Using relation style for 15pt text +Text(Loc.Chat.Empty.Feature.yoursForever) + .anytypeStyle(.relation3Regular) // 12pt instead of 15pt! + +// ❌ WRONG: Adding "ux" to caption style +StandardButton("Add", style: .uxCaption1Medium) // Doesn't exist! +``` + +## Source Files + +- **Enum definition**: `Modules/DesignKit/Sources/DesignKit/Fonts/Config/AnytypeFont.swift` +- **Font configurations**: `Modules/DesignKit/Sources/DesignKit/Fonts/Config/AnytypeFontConfig.swift` +- **Figma source**: [Typography-Mobile](https://www.figma.com/file/vgXV7x2v20vJajc7clYJ7a/Typography-Mobile?node-id=0%3A12) + +## Contributing + +Found a missing mapping or incorrect information? Update this document and: +1. Verify against `AnytypeFont.swift` enum +2. Verify specs in `AnytypeFontConfig.swift` +3. Test with actual Figma designs +4. Update examples if needed + +--- + +*Last updated: 2025-10-23* +*This mapping is based on `AnytypeFont` enum and `AnytypeFontConfig` as of this date.* diff --git a/Anytype/Sources/PresentationLayer/Common/UIKit/ImageViewer/ImageViewer/AnytypePreviewController.swift b/Anytype/Sources/PresentationLayer/Common/UIKit/ImageViewer/ImageViewer/AnytypePreviewController.swift index baaafc2ddc..33dfbe4576 100644 --- a/Anytype/Sources/PresentationLayer/Common/UIKit/ImageViewer/ImageViewer/AnytypePreviewController.swift +++ b/Anytype/Sources/PresentationLayer/Common/UIKit/ImageViewer/ImageViewer/AnytypePreviewController.swift @@ -1,7 +1,6 @@ import QuickLook import Combine import Services -import AnytypeCore @MainActor final class AnytypePreviewController: QLPreviewController { @@ -67,11 +66,6 @@ final class AnytypePreviewController: QLPreviewController { } private func handleItemUpdate() { - if FeatureFlags.doNotWaitCompletionInAnytypePreview { - refreshCurrentPreviewItem() - return - } - if didFinishTransition { refreshCurrentPreviewItem() } else { diff --git a/Anytype/Sources/PresentationLayer/Debug/Examples/ControlsExample.swift b/Anytype/Sources/PresentationLayer/Debug/Examples/ControlsExample.swift index 42ccbaa588..3c530f4439 100644 --- a/Anytype/Sources/PresentationLayer/Debug/Examples/ControlsExample.swift +++ b/Anytype/Sources/PresentationLayer/Debug/Examples/ControlsExample.swift @@ -16,17 +16,14 @@ struct ControlsExample: View { makeLargeButtonVariants(title: "Destructive Large - Light", style: .warningLarge).colorScheme(.light) makeLargeButtonVariants(title: "Destructive Large - Dark", style: .warningLarge).colorScheme(.dark) - - makeLargeButtonVariants(title: "Primary Oval Large - Light", style: .primaryOvalLarge).colorScheme(.light) - makeLargeButtonVariants(title: "Primary Oval Large - Dark", style: .primaryOvalLarge).colorScheme(.dark) - - makeLargeButtonVariants(title: "Secondary Oval Large - Light", style: .secondaryOvalLarge).colorScheme(.light) - makeLargeButtonVariants(title: "Secondary Oval Large - Dark", style: .secondaryOvalLarge).colorScheme(.dark) - + makeLargeButtonVariants(title: "Link Large - Light", style: .linkLarge).colorScheme(.light) makeLargeButtonVariants(title: "Link Large - Dark", style: .linkLarge).colorScheme(.dark) + + makeLargeButtonVariants(title: "Borderless Large - Light", style: .borderlessLarge).colorScheme(.light) + makeLargeButtonVariants(title: "Borderless Large - Dark", style: .borderlessLarge).colorScheme(.dark) } - + Group { makeTwoByLineButtonVariants(title: "Primary Medium - Light", style: .primaryMedium).colorScheme(.light) makeTwoByLineButtonVariants(title: "Primary Medium - Dark", style: .primaryMedium).colorScheme(.dark) @@ -47,8 +44,11 @@ struct ControlsExample: View { makeTwoByLineButtonVariants(title: "Destructive Small - Light", style: .warningSmall).colorScheme(.light) makeTwoByLineButtonVariants(title: "Destructive Small - Dark", style: .warningSmall).colorScheme(.dark) + + makeTwoByLineButtonVariants(title: "Borderless Small - Light", style: .borderlessSmall).colorScheme(.light) + makeTwoByLineButtonVariants(title: "Borderless Small - Dark", style: .borderlessSmall).colorScheme(.dark) } - + Group { makeTwoByLineButtonVariants(title: "Primary XSmall - Light", style: .primaryXSmall).colorScheme(.light) makeTwoByLineButtonVariants(title: "Primary XSmall - Dark", style: .primaryXSmall).colorScheme(.dark) @@ -61,8 +61,14 @@ struct ControlsExample: View { makeTwoByLineButtonVariants(title: "Transparent XSmall - Light", style: .transparentXSmall).colorScheme(.light) makeTwoByLineButtonVariants(title: "Transparent XSmall - Dark", style: .transparentXSmall).colorScheme(.dark) + + makeLargeButtonVariants(title: "Primary XSmall Stretched - Light", style: .primaryXSmallStretched).colorScheme(.light) + makeLargeButtonVariants(title: "Primary XSmall Stretched - Dark", style: .primaryXSmallStretched).colorScheme(.dark) + + makeLargeButtonVariants(title: "Upgrade Badge - Light", style: .upgradeBadge).colorScheme(.light) + makeLargeButtonVariants(title: "Upgrade Badge - Dark", style: .upgradeBadge).colorScheme(.dark) } - + Group { makeComposeButtons(title: "Composite buttons") .colorScheme(.light) diff --git a/Anytype/Sources/PresentationLayer/Debug/ExportStackGoroutines/ExportStackGoroutinesViewModifier.swift b/Anytype/Sources/PresentationLayer/Debug/ExportStackGoroutines/ExportStackGoroutinesViewModifier.swift index a28b84f290..00095a07c4 100644 --- a/Anytype/Sources/PresentationLayer/Debug/ExportStackGoroutines/ExportStackGoroutinesViewModifier.swift +++ b/Anytype/Sources/PresentationLayer/Debug/ExportStackGoroutines/ExportStackGoroutinesViewModifier.swift @@ -1,11 +1,9 @@ import SwiftUI import Services - struct ExportStackGoroutinesViewModifier: ViewModifier { - @Injected(\.debugService) - private var debugService: any DebugServiceProtocol + @State private var model = ExportStackGoroutinesViewModel() @State private var shareUrlFile: URL? @Binding var isPresented: Bool @@ -21,10 +19,21 @@ struct ExportStackGoroutinesViewModifier: ViewModifier { } private func exportStackGoroutines() { - Task { shareUrlFile = try await debugService.exportStackGoroutinesZip() } + Task { shareUrlFile = try await model.exportStackGoroutinesZip() } } } +@MainActor +@Observable +private final class ExportStackGoroutinesViewModel { + + @Injected(\.debugService) @ObservationIgnored + private var debugService: any DebugServiceProtocol + + func exportStackGoroutinesZip() async throws -> URL { + try await debugService.exportStackGoroutinesZip() + } +} extension View { func exportStackGoroutinesSheet(isPresented: Binding) -> some View { diff --git a/Anytype/Sources/PresentationLayer/Debug/FeatureFlags/FeatureFlagView.swift b/Anytype/Sources/PresentationLayer/Debug/FeatureFlags/FeatureFlagView.swift index 036e0f50be..069613ce4d 100644 --- a/Anytype/Sources/PresentationLayer/Debug/FeatureFlags/FeatureFlagView.swift +++ b/Anytype/Sources/PresentationLayer/Debug/FeatureFlags/FeatureFlagView.swift @@ -42,7 +42,6 @@ struct FeatureFlagView: View { Group { Text("Nightly - \(model.description.debugValue ? "on" : "off")") Text("Release Anytype - \(model.description.releaseAnytypeValue ? "on" : "off")") - Text("Release AnyApp - \(model.description.releaseAnyAppValue ? "on" : "off")") } .font(AnytypeFontBuilder.font(anytypeFont: .calloutRegular)) .foregroundColor(.Text.secondary) diff --git a/Anytype/Sources/PresentationLayer/FileDownloading flow/FileDownloadingCoordinator.swift b/Anytype/Sources/PresentationLayer/FileDownloading flow/FileDownloadingCoordinator.swift index 20aa76bb76..0bd1b2e78a 100644 --- a/Anytype/Sources/PresentationLayer/FileDownloading flow/FileDownloadingCoordinator.swift +++ b/Anytype/Sources/PresentationLayer/FileDownloading flow/FileDownloadingCoordinator.swift @@ -40,7 +40,7 @@ extension FileDownloadingCoordinator: FileDownloadingModuleOutput { func didDownloadFileTo(_ url: URL) { type.flatMap { - AnytypeAnalytics.instance().logDownloadMedia(type: $0, spaceId: spaceId) + AnytypeAnalytics.instance().logDownloadMedia(type: $0) } viewController?.topPresentedController.dismiss(animated: true) { [weak self] in self?.showDocumentPickerViewController(url: url) diff --git a/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorView.swift index 6a8ca994ed..240226f7a6 100644 --- a/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorView.swift @@ -2,12 +2,12 @@ import SwiftUI struct ChatCoordinatorView: View { - @StateObject private var model: ChatCoordinatorViewModel + @State private var model: ChatCoordinatorViewModel @Environment(\.pageNavigation) private var pageNavigation @Environment(\.chatActionProvider) private var chatActionProvider init(data: ChatCoordinatorData) { - self._model = StateObject(wrappedValue: ChatCoordinatorViewModel(data: data)) + self._model = State(wrappedValue: ChatCoordinatorViewModel(data: data)) } var body: some View { diff --git a/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorViewModel.swift index 8e11be67e2..bb5ce2fc4e 100644 --- a/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Flows/ChatCoordinator/ChatCoordinatorViewModel.swift @@ -9,35 +9,41 @@ struct ChatCoordinatorData: Hashable, Codable { } @MainActor -final class ChatCoordinatorViewModel: ObservableObject, ChatModuleOutput { +@Observable +final class ChatCoordinatorViewModel: ChatModuleOutput { + @ObservationIgnored let chatId: String + @ObservationIgnored let spaceId: String - @Published var objectToMessageSearchData: ObjectSearchWithMetaModuleData? - @Published var showEmojiData: MessageReactionPickerData? - @Published var showSyncStatusInfo = false - @Published var objectIconPickerData: ObjectIconPickerData? - @Published var linkToObjectData: LinkToObjectSearchModuleData? - @Published var showFilesPicker = false - @Published var showPhotosPicker = false - @Published var pushNotificationsAlertData: PushNotificationsAlertData? - @Published var showDisabledPushNotificationsAlert = false - @Published var photosItems: [PhotosPickerItem] = [] - @Published var participantsReactionData: MessageParticipantsReactionData? - @Published var safariUrl: URL? - @Published var cameraData: SimpleCameraData? - @Published var showSpaceSettingsData: AccountInfo? - @Published var newLinkedObject: EditorScreenData? - @Published var spaceShareData: SpaceShareData? - @Published var qrCodeInviteLink: URL? - + var objectToMessageSearchData: ObjectSearchWithMetaModuleData? + var showEmojiData: MessageReactionPickerData? + var showSyncStatusInfo = false + var objectIconPickerData: ObjectIconPickerData? + var linkToObjectData: LinkToObjectSearchModuleData? + var showFilesPicker = false + var showPhotosPicker = false + var pushNotificationsAlertData: PushNotificationsAlertData? + var showDisabledPushNotificationsAlert = false + var photosItems: [PhotosPickerItem] = [] + var participantsReactionData: MessageParticipantsReactionData? + var safariUrl: URL? + var cameraData: SimpleCameraData? + var showSpaceSettingsData: AccountInfo? + var newLinkedObject: EditorScreenData? + var spaceShareData: SpaceShareData? + var qrCodeInviteLink: URL? + + @ObservationIgnored private var filesPickerData: FilesPickerData? + @ObservationIgnored private var photosPickerData: ChatPhotosPickerData? + @ObservationIgnored var pageNavigation: PageNavigation? - @Injected(\.objectActionsService) + @Injected(\.objectActionsService) @ObservationIgnored private var objectActionsService: any ObjectActionsServiceProtocol init(data: ChatCoordinatorData) { diff --git a/Anytype/Sources/PresentationLayer/Flows/EditorSetFlow/EditorSetCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Flows/EditorSetFlow/EditorSetCoordinatorViewModel.swift index b729469b27..1380064c5f 100644 --- a/Anytype/Sources/PresentationLayer/Flows/EditorSetFlow/EditorSetCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Flows/EditorSetFlow/EditorSetCoordinatorViewModel.swift @@ -253,10 +253,10 @@ final class EditorSetCoordinatorViewModel: func templateEditingHandler( setting: ObjectCreationSetting, - onSetAsDefaultTempalte: @escaping (String) -> Void, + onSetAsDefaultTemplate: @escaping (String) -> Void, onTemplateSelection: ((ObjectCreationSetting) -> Void)? ) { - legacySetObjectCreationSettingsCoordinator.templateEditingHandler(setting: setting, onSetAsDefaultTempalte: onSetAsDefaultTempalte, onTemplateSelection: onTemplateSelection) + legacySetObjectCreationSettingsCoordinator.templateEditingHandler(setting: setting, onSetAsDefaultTemplate: onSetAsDefaultTemplate, onTemplateSelection: onTemplateSelection) } func onObjectTypeLayoutTap(_ data: LayoutPickerData) { @@ -282,7 +282,7 @@ final class EditorSetCoordinatorViewModel: templatesCoordinator.showTemplatesPicker( data: data, - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.setTemplateAsDefault(objectId: objectId, templateId: templateId) } ) diff --git a/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorView.swift index ea1536011c..30d14a3c6f 100644 --- a/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorView.swift @@ -8,7 +8,7 @@ struct HomeWidgetData: Hashable { struct HomeWidgetsCoordinatorView: View { let data: HomeWidgetData - + var body: some View { SpaceLoadingContainerView(spaceId: data.spaceId, showBackground: true) { HomeWidgetsCoordinatorInternalView(info: $0) @@ -17,14 +17,14 @@ struct HomeWidgetsCoordinatorView: View { } private struct HomeWidgetsCoordinatorInternalView: View { - + @State private var model: HomeWidgetsCoordinatorViewModel @Environment(\.pageNavigation) private var pageNavigation - + init(info: AccountInfo) { self._model = State(wrappedValue: HomeWidgetsCoordinatorViewModel(info: info)) } - + var body: some View { HomeWidgetsView(info: model.spaceInfo, output: model) .onAppear { diff --git a/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorViewModel.swift index f707549c69..888091a5b7 100644 --- a/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Flows/HomeWidgetsCoordinator/HomeWidgetsCoordinatorViewModel.swift @@ -30,7 +30,7 @@ final class HomeWidgetsCoordinatorViewModel: HomeWidgetsModuleOutput, SetObjectC } func onCreateObjectType() { - createTypeData = CreateObjectTypeData(spaceId: spaceInfo.accountSpaceId, name: "") + createTypeData = CreateObjectTypeData(spaceId: spaceInfo.accountSpaceId, name: "", route: .screenWidget) } func onObjectSelected(screenData: ScreenData) { diff --git a/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorView.swift index c0abb4b6b4..ad5c537121 100644 --- a/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorView.swift @@ -7,7 +7,7 @@ struct SpaceHubCoordinatorView: View { @Environment(\.keyboardDismiss) private var keyboardDismiss @Environment(\.dismissAllPresented) private var dismissAllPresented - @StateObject private var model = SpaceHubCoordinatorViewModel() + @State private var model = SpaceHubCoordinatorViewModel() @Namespace private var namespace @@ -115,10 +115,10 @@ struct SpaceHubCoordinatorView: View { } } - private var content: some View { + private var content: some View { ZStack { - NotificationCoordinatorView() - + Color.Background.primary + HomeBottomPanelContainer( path: $model.navigationPath, content: { @@ -156,6 +156,8 @@ struct SpaceHubCoordinatorView: View { } } ) + + NotificationCoordinatorView() } .animation(.easeInOut, value: model.spaceInfo) .pageNavigation(model.pageNavigation) diff --git a/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorViewModel.swift index 040807c75c..7befe37565 100644 --- a/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/SpaceHubCoordinatorViewModel.swift @@ -9,36 +9,39 @@ import PhotosUI struct SpaceHubNavigationItem: Hashable { } @MainActor -final class SpaceHubCoordinatorViewModel: ObservableObject, SpaceHubModuleOutput { - @Published var showSpaceManager = false - @Published var showObjectIsNotAvailableAlert = false - @Published var profileData: ObjectInfo? - @Published var spaceProfileData: AccountInfo? - @Published var userWarningAlert: UserWarningAlert? - @Published var typeSearchForObjectCreationSpaceId: StringIdentifiable? - @Published var showSharingExtension = false - @Published var membershipTierId: IntIdentifiable? - @Published var showGalleryImport: GalleryInstallationData? - @Published var spaceJoinData: SpaceJoinModuleData? - @Published var membershipNameFinalizationData: MembershipTier? - @Published var showGlobalSearchData: GlobalSearchModuleData? - @Published var toastBarData: ToastBarData? - @Published var showSpaceShareData: SpaceShareData? - @Published var showSpaceMembersData: SpaceMembersData? - @Published var chatProvider = ChatActionProvider() - @Published var bookmarkScreenData: BookmarkScreenData? - @Published var spaceCreateData: SpaceCreateData? - @Published var showSpaceTypeForCreate = false - @Published var shouldScanQrCode = false - @Published var showAppSettings = false - - @Published var photosItems: [PhotosPickerItem] = [] - @Published var showPhotosPicker = false - @Published var cameraData: SimpleCameraData? - @Published var showFilesPicker = false +@Observable +final class SpaceHubCoordinatorViewModel: SpaceHubModuleOutput { + var showSpaceManager = false + var showObjectIsNotAvailableAlert = false + var profileData: ObjectInfo? + var spaceProfileData: AccountInfo? + var userWarningAlert: UserWarningAlert? + var typeSearchForObjectCreationSpaceId: StringIdentifiable? + var showSharingExtension = false + var membershipTierId: IntIdentifiable? + var showGalleryImport: GalleryInstallationData? + var spaceJoinData: SpaceJoinModuleData? + var membershipNameFinalizationData: MembershipTier? + var showGlobalSearchData: GlobalSearchModuleData? + var toastBarData: ToastBarData? + var showSpaceShareData: SpaceShareData? + var showSpaceMembersData: SpaceMembersData? + var chatProvider = ChatActionProvider() + var bookmarkScreenData: BookmarkScreenData? + var spaceCreateData: SpaceCreateData? + var showSpaceTypeForCreate = false + var shouldScanQrCode = false + var showAppSettings = false + + var photosItems: [PhotosPickerItem] = [] + var showPhotosPicker = false + var cameraData: SimpleCameraData? + var showFilesPicker = false + + @ObservationIgnored private var uploadSpaceId: String? - @Published var currentSpaceId: String? + var currentSpaceId: String? var spaceInfo: AccountInfo? { guard let currentSpaceId else { return nil } return workspaceStorage.spaceInfo(spaceId: currentSpaceId) @@ -47,10 +50,12 @@ final class SpaceHubCoordinatorViewModel: ObservableObject, SpaceHubModuleOutput var fallbackSpaceId: String? { userDefaults.lastOpenedScreen?.spaceId ?? fallbackSpaceView?.targetSpaceId } - @Published private var fallbackSpaceView: SpaceView? - @Published var pathChanging: Bool = false - @Published var navigationPath = HomePath(initialPath: [SpaceHubNavigationItem()]) + private var fallbackSpaceView: SpaceView? + + var pathChanging: Bool = false + var navigationPath = HomePath(initialPath: [SpaceHubNavigationItem()]) + @ObservationIgnored lazy var pageNavigation = PageNavigation( open: { [weak self] data in self?.showScreenSync(data: data) @@ -71,40 +76,43 @@ final class SpaceHubCoordinatorViewModel: ObservableObject, SpaceHubModuleOutput } ) + @ObservationIgnored var keyboardDismiss: KeyboardDismiss? + @ObservationIgnored var dismissAllPresented: DismissAllPresented? - @Injected(\.appActionStorage) + @Injected(\.appActionStorage) @ObservationIgnored private var appActionsStorage: AppActionStorage - @Injected(\.accountManager) + @Injected(\.accountManager) @ObservationIgnored private var accountManager: any AccountManagerProtocol - @Injected(\.activeSpaceManager) + @Injected(\.activeSpaceManager) @ObservationIgnored private var activeSpaceManager: any ActiveSpaceManagerProtocol - @Injected(\.documentsProvider) + @Injected(\.documentsProvider) @ObservationIgnored private var documentsProvider: any DocumentsProviderProtocol - @Injected(\.spaceViewsStorage) + @Injected(\.spaceViewsStorage) @ObservationIgnored private var workspaceStorage: any SpaceViewsStorageProtocol - @Injected(\.userDefaultsStorage) + @Injected(\.userDefaultsStorage) @ObservationIgnored private var userDefaults: any UserDefaultsStorageProtocol - @Injected(\.objectTypeProvider) + @Injected(\.objectTypeProvider) @ObservationIgnored private var typeProvider: any ObjectTypeProviderProtocol - @Injected(\.objectActionsService) + @Injected(\.objectActionsService) @ObservationIgnored private var objectActionsService: any ObjectActionsServiceProtocol - @Injected(\.defaultObjectCreationService) + @Injected(\.defaultObjectCreationService) @ObservationIgnored private var defaultObjectService: any DefaultObjectCreationServiceProtocol - @Injected(\.loginStateService) + @Injected(\.loginStateService) @ObservationIgnored private var loginStateService: any LoginStateServiceProtocol - @Injected(\.participantSpacesStorage) + @Injected(\.participantSpacesStorage) @ObservationIgnored private var participantSpacesStorage: any ParticipantSpacesStorageProtocol - @Injected(\.userWarningAlertsHandler) + @Injected(\.userWarningAlertsHandler) @ObservationIgnored private var userWarningAlertsHandler: any UserWarningAlertsHandlerProtocol - @Injected(\.legacyNavigationContext) + @Injected(\.legacyNavigationContext) @ObservationIgnored private var navigationContext: any NavigationContextProtocol - @Injected(\.spaceFileUploadService) + @Injected(\.spaceFileUploadService) @ObservationIgnored private var spaceFileUploadService: any SpaceFileUploadServiceProtocol - @Injected(\.spaceHubPathUXTypeHelper) + @Injected(\.spaceHubPathUXTypeHelper) @ObservationIgnored private var spaceHubPathUXTypeHelper: any SpaceHubPathUXTypeHelperProtocol + @ObservationIgnored private var needSetup = true init() { } @@ -155,7 +163,7 @@ final class SpaceHubCoordinatorViewModel: ObservableObject, SpaceHubModuleOutput func setupInitialScreen() async { guard !loginStateService.isFirstLaunchAfterRegistration, appActionsStorage.action.isNil else { return } - + switch userDefaults.lastOpenedScreen { case .editor(let editorData): try? await showScreen(data: .editor(editorData)) @@ -217,7 +225,10 @@ final class SpaceHubCoordinatorViewModel: ObservableObject, SpaceHubModuleOutput } func onSelectQrCodeScan() { - shouldScanQrCode = true + Task { + await dismissAllPresented?() + shouldScanQrCode = true + } } func startSpaceSubscription() async { diff --git a/Anytype/Sources/PresentationLayer/Flows/SpaceHub/Views/UploadStatusBannerView.swift b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/Views/UploadStatusBannerView.swift new file mode 100644 index 0000000000..a3e97bc425 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Flows/SpaceHub/Views/UploadStatusBannerView.swift @@ -0,0 +1,34 @@ +import SwiftUI +import DesignKit + +struct UploadStatusBannerView: View { + let text: String + + var body: some View { + HStack(spacing: 6) { + CircleLoadingView(Color.Control.primary) + .frame(width: 18, height: 18) + + Text(text) + .font(AnytypeFontBuilder.font(anytypeFont: .caption1Medium)) + .foregroundColor(Color.Text.secondary) + } + .padding(.horizontal, 16) + .padding(.vertical, 8) + .background( + Capsule() + .fill(Color.Background.secondary) + .shadow(color: Color.black.opacity(0.15), radius: 40, x: 0, y: 8) + ) + } +} + +#Preview { + VStack(spacing: 20) { + UploadStatusBannerView(text: "1 file uploading") + UploadStatusBannerView(text: "5 files uploading") + UploadStatusBannerView(text: "Syncing...") + } + .padding() + .background(Color.Background.secondary) +} diff --git a/Anytype/Sources/PresentationLayer/Migration/MigrationView.swift b/Anytype/Sources/PresentationLayer/Migration/MigrationView.swift index dc45927972..e62a035faa 100644 --- a/Anytype/Sources/PresentationLayer/Migration/MigrationView.swift +++ b/Anytype/Sources/PresentationLayer/Migration/MigrationView.swift @@ -53,7 +53,7 @@ struct MigrationView: View { StandardButton( Loc.Migration.Initial.startUpdate, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.startUpdate() } @@ -61,7 +61,7 @@ struct MigrationView: View { Spacer.fixedHeight(8) StandardButton( Loc.Migration.Initial.readMore, - style: .secondaryOvalLarge, + style: .secondaryLarge, action: { model.readMore() } @@ -108,7 +108,7 @@ struct MigrationView: View { Spacer() StandardButton( Loc.tryAgain, - style: .primaryOvalLarge, + style: .primaryLarge, action: { model.tryAgainTapped() } diff --git a/Anytype/Sources/PresentationLayer/Modules/BinList/BimListViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/BinList/BimListViewModel.swift index ebb9750b47..23e129aeb2 100644 --- a/Anytype/Sources/PresentationLayer/Modules/BinList/BimListViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/BinList/BimListViewModel.swift @@ -106,7 +106,7 @@ final class BinListViewModel: ObservableObject, OptionsItemProvider { } private func subscribeOnParticipant() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: spaceId).values { + for await participant in accountParticipantStorage.participantSequence(spaceId: spaceId) { self.participant = participant updateView() } diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentProcessor.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentProcessor.swift index 34c54a22af..3f2d70e840 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentProcessor.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentProcessor.swift @@ -7,19 +7,19 @@ import Factory import AnytypeCore @MainActor -protocol AttachmentProcessor { +protocol AttachmentProcessor: AnyObject { associatedtype Input func process(_ input: Input, spaceId: String) throws -> ChatLinkedObject } @MainActor -protocol AsyncAttachmentProcessor { +protocol AsyncAttachmentProcessor: AnyObject { associatedtype Input func process(_ input: Input, spaceId: String) async throws -> ChatLinkedObject } @MainActor -struct FileAttachmentProcessor: AttachmentProcessor { +final class FileAttachmentProcessor: AttachmentProcessor { @Injected(\.fileActionsService) private var fileActionsService: any FileActionsServiceProtocol @@ -39,7 +39,7 @@ struct FileAttachmentProcessor: AttachmentProcessor { } @MainActor -struct CameraMediaProcessor: AttachmentProcessor { +final class CameraMediaProcessor: AttachmentProcessor { @Injected(\.fileActionsService) private var fileActionsService: any FileActionsServiceProtocol @@ -61,7 +61,7 @@ struct CameraMediaProcessor: AttachmentProcessor { } @MainActor -struct PhotosPickerProcessor: AsyncAttachmentProcessor { +final class PhotosPickerProcessor: AsyncAttachmentProcessor { @Injected(\.fileActionsService) private var fileActionsService: any FileActionsServiceProtocol @@ -73,7 +73,7 @@ struct PhotosPickerProcessor: AsyncAttachmentProcessor { } @MainActor -struct PasteBufferProcessor: AsyncAttachmentProcessor { +final class PasteBufferProcessor: AsyncAttachmentProcessor { @Injected(\.fileActionsService) private var fileActionsService: any FileActionsServiceProtocol @@ -87,7 +87,7 @@ struct PasteBufferProcessor: AsyncAttachmentProcessor { } @MainActor -struct LinkPreviewProcessor: AsyncAttachmentProcessor { +final class LinkPreviewProcessor: AsyncAttachmentProcessor { @Injected(\.bookmarkService) private var bookmarkService: any BookmarkServiceProtocol @@ -106,7 +106,7 @@ struct LinkPreviewProcessor: AsyncAttachmentProcessor { } @MainActor -struct UploadedObjectProcessor: AttachmentProcessor { +final class UploadedObjectProcessor: AttachmentProcessor { func process(_ input: MessageAttachmentDetails, spaceId: String) throws -> ChatLinkedObject { return .uploadedObject(input) diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentValidator.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentValidator.swift index a783630652..c4ca16cfc0 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentValidator.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/AttachmentValidator.swift @@ -13,7 +13,7 @@ struct AttachmentValidationResult { } @MainActor -struct ChatAttachmentValidator { +final class ChatAttachmentValidator { @Injected(\.chatMessageLimits) private var chatMessageLimits: any ChatMessageLimitsProtocol diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/ChatView.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/ChatView.swift index 501d2d49e6..43c67c1645 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/ChatView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/ChatView.swift @@ -4,13 +4,13 @@ import AnytypeCore struct ChatView: View { - @StateObject private var model: ChatViewModel + @State private var model: ChatViewModel @State private var actionState = ChatActionOverlayState() @Environment(\.keyboardDismiss) private var keyboardDismiss @Environment(\.chatActionProvider) private var chatActionProvider init(spaceId: String, chatId: String, output: (any ChatModuleOutput)?) { - self._model = StateObject(wrappedValue: ChatViewModel(spaceId: spaceId, chatId: chatId, output: output)) + self._model = State(wrappedValue: ChatViewModel(spaceId: spaceId, chatId: chatId, output: output)) } var body: some View { diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/ChatViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/ChatViewModel.swift index e9eb338bc0..dfab94caf7 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/ChatViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/ChatViewModel.swift @@ -7,52 +7,55 @@ import Collections import UIKit import NotificationsCore import ProtobufMessages +import AsyncAlgorithms @preconcurrency import Combine @MainActor -final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProviderHandler { +@Observable +final class ChatViewModel: MessageModuleOutput, ChatActionProviderHandler { // MARK: - DI let spaceId: String let chatId: String + @ObservationIgnored private weak var output: (any ChatModuleOutput)? - @Injected(\.blockService) + @Injected(\.blockService) @ObservationIgnored private var blockService: any BlockServiceProtocol - @Injected(\.participantsStorage) + @Injected(\.participantsStorage) @ObservationIgnored private var accountParticipantsStorage: any ParticipantsStorageProtocol - @Injected(\.mentionObjectsService) + @Injected(\.mentionObjectsService) @ObservationIgnored private var mentionObjectsService: any MentionObjectsServiceProtocol - @Injected(\.chatActionService) + @Injected(\.chatActionService) @ObservationIgnored private var chatActionService: any ChatActionServiceProtocol - @Injected(\.fileActionsService) + @Injected(\.fileActionsService) @ObservationIgnored private var fileActionsService: any FileActionsServiceProtocol - @Injected(\.chatService) + @Injected(\.chatService) @ObservationIgnored private var chatService: any ChatServiceProtocol - @Injected(\.chatInputConverter) + @Injected(\.chatInputConverter) @ObservationIgnored private var chatInputConverter: any ChatInputConverterProtocol - @Injected(\.chatMessageLimits) + @Injected(\.chatMessageLimits) @ObservationIgnored private var chatMessageLimits: any ChatMessageLimitsProtocol - @Injected(\.messageTextBuilder) + @Injected(\.messageTextBuilder) @ObservationIgnored private var messageTextBuilder: any MessageTextBuilderProtocol - @Injected(\.searchService) + @Injected(\.searchService) @ObservationIgnored private var searchService: any SearchServiceProtocol - @Injected(\.objectTypeProvider) + @Injected(\.objectTypeProvider) @ObservationIgnored private var objectTypeProvider: any ObjectTypeProviderProtocol - @Injected(\.iconColorService) + @Injected(\.iconColorService) @ObservationIgnored private var iconColorService: any IconColorServiceProtocol - @Injected(\.bookmarkService) + @Injected(\.bookmarkService) @ObservationIgnored private var bookmarkService: any BookmarkServiceProtocol - @Injected(\.participantSpacesStorage) + @Injected(\.participantSpacesStorage) @ObservationIgnored private var participantSpacesStorage: any ParticipantSpacesStorageProtocol - @Injected(\.pushNotificationsAlertHandler) + @Injected(\.pushNotificationsAlertHandler) @ObservationIgnored private var pushNotificationsAlertHandler: any PushNotificationsAlertHandlerProtocol - @Injected(\.notificationsCenterService) + @Injected(\.notificationsCenterService) @ObservationIgnored private var notificationsCenterService: any NotificationsCenterServiceProtocol - @Injected(\.workspaceService) + @Injected(\.workspaceService) @ObservationIgnored private var workspaceService: any WorkspaceServiceProtocol - @Injected(\.universalLinkParser) + @Injected(\.universalLinkParser) @ObservationIgnored private var universalLinkParser: any UniversalLinkParserProtocol private let participantSubscription: any ParticipantsSubscriptionProtocol @@ -65,64 +68,75 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv // Global - @Published var dataLoaded = false - @Published var canEdit = false - @Published var qrCodeInviteUrl: URL? + var dataLoaded = false + var canEdit = false + var qrCodeInviteUrl: URL? + @ObservationIgnored var keyboardDismiss: KeyboardDismiss? // Input Message - @Published var message = NSAttributedString() - @Published var inputFocused = false - @Published var replyToMessage: ChatInputReplyModel? - @Published var editMessage: ChatMessage? - @Published var sendMessageTaskInProgress: Bool = false - @Published var sendButtonIsLoading: Bool = false - @Published var messageTextLimit: String? - @Published var textLimitReached = false - @Published var typesForCreateObject: [ObjectType] = [] - @Published var participantSpaceView: ParticipantSpaceViewData? + var message = NSAttributedString() + var inputFocused = false + var replyToMessage: ChatInputReplyModel? + var editMessage: ChatMessage? + var sendMessageTaskInProgress: Bool = false + var sendButtonIsLoading: Bool = false + var messageTextLimit: String? + var textLimitReached = false + var typesForCreateObject: [ObjectType] = [] + var participantSpaceView: ParticipantSpaceViewData? // Actions - @Published var actionModel: ChatActionPanelModel = .hidden + var actionModel: ChatActionPanelModel = .hidden // Attachment Handler let attachmentHandler: any ChatAttachmentHandlerProtocol // Attachment Handler Published State - @Published var linkedObjects: [ChatLinkedObject] = [] - @Published var attachmentsDownloading: Bool = false - @Published var photosItemsTask = UUID() + var linkedObjects: [ChatLinkedObject] = [] + var attachmentsDownloading: Bool = false + var photosItemsTask = UUID() // List - @Published var mentionSearchState = ChatTextMention.finish - @Published var mesageBlocks: [MessageSectionData] = [] - @Published var mentionObjectsModels: [MentionObjectModel] = [] - @Published var collectionViewScrollProxy = ChatCollectionScrollProxy() - @Published var messageYourBackgroundColor: Color = .Background.Chat.bubbleYour - @Published var messageHiglightId: String = "" + var mentionSearchState = ChatTextMention.finish + var mesageBlocks: [MessageSectionData] = [] + var mentionObjectsModels: [MentionObjectModel] = [] + var collectionViewScrollProxy = ChatCollectionScrollProxy() + var messageYourBackgroundColor: Color = .Background.Chat.bubbleYour + var messageHiglightId: String = "" + @ObservationIgnored private var messages: [FullChatMessage] = [] + @ObservationIgnored private var chatState: ChatState? + @ObservationIgnored private var participants: [Participant] = [] + @ObservationIgnored private var firstUnreadMessageOrderId: String? + @ObservationIgnored private var bottomVisibleOrderId: String? + @ObservationIgnored private var bigDistanceToBottom: Bool = false + @ObservationIgnored private var forceHiddenActionPanel: Bool = true + @ObservationIgnored private var showScreenLogged = false - + @ObservationIgnored var showEmptyState: Bool { mesageBlocks.isEmpty && dataLoaded } + @ObservationIgnored var conversationType: ConversationType { participantSpaceView?.spaceView.uxType.asConversationType ?? .chat } + @ObservationIgnored var participantPermissions: ParticipantPermissions? { participantSpaceView?.participant?.permission } // Alerts - @Published var deleteMessageConfirmation: MessageViewData? - @Published var showSendLimitAlert = false - @Published var toastBarData: ToastBarData? + var deleteMessageConfirmation: MessageViewData? + var showSendLimitAlert = false + var toastBarData: ToastBarData? init(spaceId: String, chatId: String, output: (any ChatModuleOutput)?) { self.spaceId = spaceId @@ -134,24 +148,9 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv // Open object. Middleware will know that we are using the object and will be make a refresh after open from background self.chatObject = openDocumentProvider.document(objectId: chatId, spaceId: spaceId) self.attachmentHandler = ChatAttachmentHandler(spaceId: spaceId) - - setupAttachmentHandler() - } - - private func setupAttachmentHandler() { - // Subscribe to attachment handler publishers - attachmentHandler.linkedObjectsPublisher - .assign(to: &$linkedObjects) - - attachmentHandler.attachmentsDownloadingPublisher - .assign(to: &$attachmentsDownloading) - - attachmentHandler.photosItemsTaskPublisher - .assign(to: &$photosItemsTask) } func onAppear() { - guard FeatureFlags.removeMessagesFromNotificationsCenter else { return } notificationsCenterService.removeDeliveredNotifications(chatId: chatId) } @@ -231,8 +230,11 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv async let typesSub: () = subscribeOnTypes() async let messageBackgroundSub: () = subscribeOnMessageBackground() async let spaceViewSub: () = subscribeOnSpaceView() + async let linkedObjectsSub: () = subscribeOnLinkedObjects() + async let attachmentsDownloadingSub: () = subscribeOnAttachmentsDownloading() + async let photosItemsTaskSub: () = subscribeOnPhotosItemsTask() - (_, _, _, _, _) = await (permissionsSub, participantsSub, typesSub, messageBackgroundSub, spaceViewSub) + _ = await (permissionsSub, participantsSub, typesSub, messageBackgroundSub, spaceViewSub, linkedObjectsSub, attachmentsDownloadingSub, photosItemsTaskSub) } func subscribeOnMessages() async throws { @@ -255,11 +257,11 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv let prevChatIsEmpty = self.messages.isEmpty self.messages = messages - self.dataLoaded = true if prevChatIsEmpty { firstUnreadMessageOrderId = chatState?.messages.oldestOrderID } await updateMessages() + self.dataLoaded = true if prevChatIsEmpty { if let oldestOrderId = chatState?.messages.oldestOrderID, let message = messages.first(where: { $0.message.orderID == oldestOrderId}) { collectionViewScrollProxy.scrollTo(itemId: message.message.id, position: .center, animated: false) @@ -437,11 +439,10 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv } func visibleRangeChanged(from: MessageSectionItem, to: MessageSectionItem) { - guard let fromMessage = from.messageData, let toMessage = to.messageData else { return } Task { - bottomVisibleOrderId = toMessage.message.orderID + bottomVisibleOrderId = to.messageOrderId forceHiddenActionPanel = false // Without update panel. Waiting middleware event. - await chatStorage.updateVisibleRange(startMessageId: fromMessage.message.id, endMessageId: toMessage.message.id) + await chatStorage.updateVisibleRange(startMessageId: from.messageId, endMessageId: to.messageId) } } @@ -627,8 +628,14 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv } private func subscribeOnPermissions() async { - for await canEditMessages in accountParticipantsStorage.canEditPublisher(spaceId: spaceId).values { - canEdit = canEditMessages + let permissionsSequence = accountParticipantsStorage.canEditSequence(spaceId: spaceId) + let deletedOrArchivedSequence = chatObject.detailsPublisher + .map { !$0.isDeleted && !$0.isArchived } + .removeDuplicates() + .values + + for await (canEditMessages, canEditChat) in combineLatest(permissionsSequence, deletedOrArchivedSequence) { + canEdit = canEditMessages && canEditChat } } @@ -650,6 +657,24 @@ final class ChatViewModel: ObservableObject, MessageModuleOutput, ChatActionProv await handlePushNotificationsAlert() } } + + private func subscribeOnLinkedObjects() async { + for await linkedObjects in attachmentHandler.linkedObjectsPublisher.values { + self.linkedObjects = linkedObjects + } + } + + private func subscribeOnAttachmentsDownloading() async { + for await attachmentsDownloading in attachmentHandler.attachmentsDownloadingPublisher.values { + self.attachmentsDownloading = attachmentsDownloading + } + } + + private func subscribeOnPhotosItemsTask() async { + for await photosItemsTask in attachmentHandler.photosItemsTaskPublisher.values { + self.photosItemsTask = photosItemsTask + } + } func updateInviteState() async { do { diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessageBuilder.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessageBuilder.swift index d2d581e2d6..4e6c1d8681 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessageBuilder.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessageBuilder.swift @@ -11,20 +11,21 @@ protocol ChatMessageBuilderProtocol: AnyObject, Sendable { } actor ChatMessageBuilder: ChatMessageBuilderProtocol, Sendable { - + private enum Constants { static let grouppingDateInterval: Int = 60 // seconds } - + private let accountParticipantsStorage: any ParticipantsStorageProtocol = Container.shared.participantsStorage() private let messageTextBuilder: any MessageTextBuilderProtocol = Container.shared.messageTextBuilder() private let workspaceStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() - + private let openDocumentProvider: any OpenedDocumentsProviderProtocol = Container.shared.openedDocumentProvider() + private let spaceId: String private let chatId: String - + private let dateFormatter = HistoryDateFormatter() - + init(spaceId: String, chatId: String) { self.spaceId = spaceId self.chatId = chatId @@ -36,10 +37,12 @@ actor ChatMessageBuilder: ChatMessageBuilderProtocol, Sendable { firstUnreadMessageOrderId: String?, limits: any ChatMessageLimitsProtocol ) async -> [MessageSectionData] { - + let isStream = workspaceStorage.spaceView(spaceId: spaceId)?.uxType.isStream ?? false let participant = accountParticipantsStorage.participants.first { $0.spaceId == spaceId } - let canEdit = participant?.canEdit ?? false + let chatObject = openDocumentProvider.document(objectId: chatId, spaceId: spaceId) + let isChatDeletedOrArchived = (chatObject.details?.isDeleted ?? false) || (chatObject.details?.isArchived ?? false) + let canEdit = (participant?.canEdit ?? false) && !isChatDeletedOrArchived let yourProfileIdentity = participant?.identity var currentSectionData: MessageSectionData? @@ -107,7 +110,7 @@ actor ChatMessageBuilder: ChatMessageBuilderProtocol, Sendable { reply: fullMessage.reply ) - let unreadItem: MessageSectionItem? = isUnread ? .unread("\(message.id)-unread") : nil + let unreadItem: MessageSectionItem? = isUnread ? .unread(id: "\(message.id)-unread", messageId: message.id, messageOrderId: message.orderID) : nil if firstInSection { if let currentSectionData { diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessagesPreviewsStorage.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessagesPreviewsStorage.swift index a5eb4b80a0..99267be22f 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessagesPreviewsStorage.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/ChatMessagesPreviewsStorage.swift @@ -84,7 +84,7 @@ actor ChatMessagesPreviewsStorage: ChatMessagesPreviewsStorageProtocol { private func handle(events: EventsBunch) async { var hasChanges = false - + for event in events.middlewareEvents { switch event.value { case let .chatStateUpdate(state): @@ -95,11 +95,15 @@ actor ChatMessagesPreviewsStorage: ChatMessagesPreviewsStorageProtocol { if await handleChatAddEvent(spaceId: event.spaceID, contextId: events.contextId, data: data) { hasChanges = true } + case let .chatDelete(data): + if handleChatDeleteEvent(spaceId: event.spaceID, contextId: events.contextId, data: data) { + hasChanges = true + } default: break } } - + if hasChanges { previewsStream.send(Array(previewsBySpace.values)) } @@ -125,11 +129,26 @@ actor ChatMessagesPreviewsStorage: ChatMessagesPreviewsStorageProtocol { private func handleChatAddEvent(spaceId: String, contextId: String, data: ChatAddData) async -> Bool { guard data.subIds.contains(subscriptionId) else { return false } - + await handleChatLastMessage(spaceId: spaceId, chatId: contextId, message: data.message, dependencies: data.dependencies.compactMap(\.asDetails)) return true } - + + private func handleChatDeleteEvent(spaceId: String, contextId: String, data: ChatDeleteData) -> Bool { + guard data.subIds.contains(subscriptionId) else { return false } + + let key = ChatMessagePreviewKey(spaceId: spaceId, chatId: contextId) + guard var preview = previewsBySpace[key] else { return false } + + guard let lastMessage = preview.lastMessage, lastMessage.id == data.id else { + return false + } + + preview.lastMessage = nil + previewsBySpace[key] = preview + return true + } + private func handleChatLastMessage(spaceId: String, chatId: String, message: ChatMessage, dependencies: [ObjectDetails]) async { guard message.hasMessage else { return } @@ -142,11 +161,12 @@ actor ChatMessagesPreviewsStorage: ChatMessagesPreviewsStorageProtocol { let attachmentsIds = message.attachments.map(\.target) let attachments = attachmentsIds.compactMap { id in dependencies.first { $0.id == id } } - + // TODO: change to full equality after MW fix let creator = dependencies.first { $0.id.hasSuffix(message.creator) }.flatMap { try? Participant(details: $0) } - + let message = LastMessagePreview( + id: message.id, creator: creator, text: messageTextBuilder.makeMessaeWithoutStyle(content: message.message), createdAt: message.createdAtDate, diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/Models/ChatMessagePreview.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/Models/ChatMessagePreview.swift index 0d3d0a1754..00d8c3f5da 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Services/Models/ChatMessagePreview.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Services/Models/ChatMessagePreview.swift @@ -2,18 +2,20 @@ import Services import Foundation struct LastMessagePreview: Hashable { + let id: String let creator: Participant? let text: String - + let createdAt: Date let modifiedAt: Date? - + let attachments: [ObjectDetails] let localizedAttachmentsText: String - + let orderId: String - - init(creator: Participant?, text: String, createdAt: Date, modifiedAt: Date?, attachments: [ObjectDetails], orderId: String) { + + init(id: String, creator: Participant?, text: String, createdAt: Date, modifiedAt: Date?, attachments: [ObjectDetails], orderId: String) { + self.id = id self.creator = creator self.text = text self.createdAt = createdAt diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/ChatHeader/ChatHeaderViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/ChatHeader/ChatHeaderViewModel.swift index 9d3bae50fe..98db5b5e88 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/ChatHeader/ChatHeaderViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/ChatHeader/ChatHeaderViewModel.swift @@ -31,6 +31,11 @@ final class ChatHeaderViewModel: ObservableObject { private let onTapAddMembers: (() -> Void) private let chatObject: any BaseDocumentProtocol + private var spaceSupportsMultiChats: Bool = false + private var spaceTitle: String? + private var spaceIcon: Icon? + private var chatDetails: ObjectDetails? + init( spaceId: String, chatId: String, @@ -46,10 +51,11 @@ final class ChatHeaderViewModel: ObservableObject { func startSubscriptions() async { async let spaceViewSub: () = subscribeOnSpaceView() + async let chatDetailsSub: () = subscribeOnChatDetails() async let chatSub: () = subscribeOnChatStatus() async let spaceStatusSub: () = subscribeOnSpaceStatus() - - _ = await (spaceViewSub, chatSub, spaceStatusSub) + + _ = await (spaceViewSub, chatDetailsSub, chatSub, spaceStatusSub) } func tapOpenWidgets() { onTapOpenWidgets() } @@ -61,14 +67,23 @@ final class ChatHeaderViewModel: ObservableObject { private func subscribeOnSpaceView() async { for await participantSpaceView in participantSpacesStorage.participantSpaceViewPublisher(spaceId: spaceId).values { let spaceView = participantSpaceView.spaceView - title = spaceView.title - icon = spaceView.objectIconImage + spaceSupportsMultiChats = spaceView.uxType.supportsMultiChats + spaceTitle = spaceView.title + spaceIcon = spaceView.objectIconImage showWidgetsButton = spaceView.chatId == chatId && spaceView.initialScreenIsChat - muted = FeatureFlags.muteSpacePossibility && !spaceView.pushNotificationMode.isUnmutedAll + muted = !spaceView.effectiveNotificationMode(for: chatId).isUnmutedAll showAddMembersButton = participantSpaceView.participant?.permission == .owner + updateHeaderDisplay() } } - + + private func subscribeOnChatDetails() async { + for await details in chatObject.detailsPublisher.values { + chatDetails = details + updateHeaderDisplay() + } + } + private func subscribeOnChatStatus() async { let loadingPublisher = chatObject.detailsPublisher .map { @@ -108,4 +123,19 @@ final class ChatHeaderViewModel: ObservableObject { spaceLoading = spaceStatus.status == .error } } + + private func updateHeaderDisplay() { + if spaceSupportsMultiChats { + if let chatDetails { + title = chatDetails.name.withPlaceholder + icon = chatDetails.objectIconImage + } else { + title = nil + icon = nil + } + } else { + title = spaceTitle + icon = spaceIcon + } + } } diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Message/MessageView.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Message/MessageView.swift index fc46b042d0..ac139ae857 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Message/MessageView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Message/MessageView.swift @@ -8,7 +8,7 @@ struct MessageView: View { static let attachmentsPadding: CGFloat = 4 static let messageHorizontalPadding: CGFloat = 12 static let coordinateSpace = "MessageViewCoordinateSpace" - static let emoji = ["👍đŸģ", "ī¸ī¸â¤ī¸", "😂"] + static let emoji = ["👍", "ī¸ī¸â¤ī¸", "😂"] } private let data: MessageViewData @@ -28,7 +28,7 @@ struct MessageView: View { var body: some View { MessageReplyActionView( - isEnabled: FeatureFlags.swipeToReply && data.canReply, + isEnabled: data.canReply, contentHorizontalPadding: Constants.messageHorizontalPadding, centerOffsetY: $bubbleCenterOffsetY, content: { diff --git a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Section/MessageSectionItem.swift b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Section/MessageSectionItem.swift index 2a169c386b..018d0ac0d1 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Section/MessageSectionItem.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Chat/Subviews/Section/MessageSectionItem.swift @@ -2,25 +2,34 @@ import Foundation enum MessageSectionItem: Equatable, Hashable, Identifiable { case message(_ data: MessageViewData) - case unread(_ id: String) + case unread(id: String, messageId: String, messageOrderId: String) var id: String { switch self { case .message(let data): data.id - case .unread(let id): + case .unread(let id, _, _): id } } } extension MessageSectionItem { - var messageData: MessageViewData? { + var messageId: String { switch self { case .message(let data): - return data - case .unread: - return nil + return data.message.id + case .unread(_, let messageId, _): + return messageId + } + } + + var messageOrderId: String { + switch self { + case .message(let data): + return data.message.orderID + case .unread(_, _, let messageOrderId): + return messageOrderId } } } diff --git a/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeView.swift b/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeView.swift index b9a7233168..7eb5b4447e 100644 --- a/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeView.swift @@ -1,10 +1,12 @@ import SwiftUI import Services +import AnytypeCore struct CreateObjectTypeData: Identifiable { let spaceId: String let name: String - + let route: ScreenCreateTypeRoute + var id: String { spaceId } } @@ -20,5 +22,8 @@ struct CreateObjectTypeView: View { ObjectTypeInfoView(info: model.info) { info in model.onCreate(info: info) } + .onAppear { + model.onAppear() + } } } diff --git a/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeViewModel.swift index f6f8fcb7a6..392fcbbc1e 100644 --- a/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/CreateObjectType/CreateObjectTypeViewModel.swift @@ -1,28 +1,33 @@ import Foundation import Services +import AnytypeCore @MainActor final class CreateObjectTypeViewModel: ObservableObject { - + @Injected(\.typesService) private var typesService: any TypesServiceProtocol private let data: CreateObjectTypeData private let completion: ((_ type: ObjectType) -> ())? - + let info: ObjectTypeInfo - + init(data: CreateObjectTypeData, completion: ((_ type: ObjectType) -> ())?) { self.data = data self.info = ObjectTypeInfo(singularName: data.name, pluralName: data.name, icon: nil, color: nil, mode: .create) self.completion = completion } - + + func onAppear() { + AnytypeAnalytics.instance().logScreenCreateType(route: data.route) + } + func onCreate(info: ObjectTypeInfo) { Task { let type = try await typesService.createType(name: info.singularName, pluralName: info.pluralName, icon: info.icon, color: info.color, spaceId: data.spaceId) - - AnytypeAnalytics.instance().logCreateObjectType(spaceId: data.spaceId) - + + AnytypeAnalytics.instance().logCreateObjectType(route: data.route) + completion?(type) } } diff --git a/Anytype/Sources/PresentationLayer/Modules/Date/DateViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/Date/DateViewModel.swift index 913ecc0fe6..c2c6095bf7 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Date/DateViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Date/DateViewModel.swift @@ -190,7 +190,7 @@ final class DateViewModel: ObservableObject { } func subscribeOnParticipant() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: spaceId).values { + for await participant in accountParticipantStorage.participantSequence(spaceId: spaceId) { participantCanEdit = participant.canEdit updateRows() } diff --git a/Anytype/Sources/PresentationLayer/Modules/Date/Subscription/DateRelatedObjectsSubscriptionService.swift b/Anytype/Sources/PresentationLayer/Modules/Date/Subscription/DateRelatedObjectsSubscriptionService.swift index d4e205b36e..9df9fbba30 100644 --- a/Anytype/Sources/PresentationLayer/Modules/Date/Subscription/DateRelatedObjectsSubscriptionService.swift +++ b/Anytype/Sources/PresentationLayer/Modules/Date/Subscription/DateRelatedObjectsSubscriptionService.swift @@ -18,6 +18,8 @@ final class DateRelatedObjectsSubscriptionService: DateRelatedObjectsSubscriptio @Injected(\.subscriptionStorageProvider) private var subscriptionStorageProvider: any SubscriptionStorageProviderProtocol + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol private lazy var subscriptionStorage: any SubscriptionStorageProtocol = { subscriptionStorageProvider.createSubscriptionStorage(subId: subscriptionId) }() @@ -33,8 +35,9 @@ final class DateRelatedObjectsSubscriptionService: DateRelatedObjectsSubscriptio update: @escaping @MainActor ([ObjectDetails], Int) -> Void ) async { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayoutsWithFiles) + SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType), spaceUxType: spaceUxType) filters } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelView.swift b/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelView.swift index 94f5401af6..25d8449f4c 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelView.swift @@ -99,13 +99,11 @@ private struct HomeBottomNavigationPanelViewInternal: View { Label(Loc.photos, systemImage: "photo") } - if FeatureFlags.loadAttachmentsOnHomePlusMenu { - Button { model.onCameraSelected() } label: { - Label(Loc.camera, systemImage: "camera") - } - Button { model.onAddFilesSelected() } label: { - Label(Loc.files, systemImage: "doc") - } + Button { model.onCameraSelected() } label: { + Label(Loc.camera, systemImage: "camera") + } + Button { model.onAddFilesSelected() } label: { + Label(Loc.files, systemImage: "doc") } Divider() diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelViewModel.swift index 3781a0d16f..02f7d15b1b 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeNavigationContainer/Panel/HomeBottomNavigationPanelViewModel.swift @@ -37,7 +37,9 @@ final class HomeBottomNavigationPanelViewModel: ObservableObject { private var objectActionsService: any ObjectActionsServiceProtocol @Injected(\.experimentalFeaturesStorage) private var experimentalFeaturesStorage: any ExperimentalFeaturesStorageProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + private weak var output: (any HomeBottomNavigationPanelModuleOutput)? private let subId = "HomeBottomNavigationProfile-\(UUID().uuidString)" @@ -110,6 +112,7 @@ final class HomeBottomNavigationPanelViewModel: ObservableObject { } func onTapHome() { + AnytypeAnalytics.instance().logClickNavigationScreenHome() output?.popToFirstInSpace() } @@ -161,8 +164,10 @@ final class HomeBottomNavigationPanelViewModel: ObservableObject { private func typesSubscription() async { for await types in objectTypeProvider.objectTypesPublisher(spaceId: info.accountSpaceId).values { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: info.accountSpaceId)?.uxType + let supportedLayouts = DetailsLayout.supportedForCreation(spaceUxType: spaceUxType) let types = types.filter { type in - DetailsLayout.supportedForCreation.contains { $0 == type.recommendedLayout } + supportedLayouts.contains { $0 == type.recommendedLayout } && !type.isTemplateType } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsView.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsView.swift index c5cca47b09..fdc4f865e1 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsView.swift @@ -6,7 +6,7 @@ import AnytypeCore struct HomeWidgetsView: View { let info: AccountInfo let output: (any HomeWidgetsModuleOutput)? - + var body: some View { HomeWidgetsInternalView(info: info, output: output) .id(info.hashValue) @@ -17,7 +17,7 @@ private struct HomeWidgetsInternalView: View { @State private var model: HomeWidgetsViewModel @State var widgetsDndState = DragState() @State var typesDndState = DragState() - + init(info: AccountInfo, output: (any HomeWidgetsModuleOutput)?) { self._model = State(wrappedValue: HomeWidgetsViewModel(info: info, output: output)) } @@ -56,7 +56,6 @@ private struct HomeWidgetsInternalView: View { private var widgets: some View { ScrollView { VStack(spacing: 0) { - topWidgets blockWidgets objectTypeWidgets AnytypeNavigationSpacer() @@ -66,13 +65,6 @@ private struct HomeWidgetsInternalView: View { } } - @ViewBuilder - private var topWidgets: some View { - if let data = model.chatWidgetData { - SpaceChatWidgetView(data: data) - } - } - @ViewBuilder private var blockWidgets: some View { if model.widgetBlocks.isNotEmpty { diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift index 4c08c50833..3973ca024c 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Container/HomeWidgetsViewModel.swift @@ -14,10 +14,10 @@ final class HomeWidgetsViewModel { } // MARK: - DI - + let info: AccountInfo let widgetObject: any BaseDocumentProtocol - + @Injected(\.blockWidgetService) @ObservationIgnored private var blockWidgetService: any BlockWidgetServiceProtocol @Injected(\.objectActionsService) @ObservationIgnored @@ -51,10 +51,9 @@ final class HomeWidgetsViewModel { var pinnedSectionIsExpanded: Bool = false var objectTypeSectionIsExpanded: Bool = false var canCreateObjectType: Bool = false - var chatWidgetData: SpaceChatWidgetData? var spaceId: String { info.accountSpaceId } - + init( info: AccountInfo, output: (any HomeWidgetsModuleOutput)? @@ -70,15 +69,14 @@ final class HomeWidgetsViewModel { async let widgetObjectSub: () = startWidgetObjectTask() async let participantTask: () = startParticipantTask() async let objectTypesTask: () = startObjectTypesTask() - async let spaceViewTask: () = startSpaceViewTask() - - _ = await (widgetObjectSub, participantTask, objectTypesTask, spaceViewTask) + + _ = await (widgetObjectSub, participantTask, objectTypesTask) } - + func onAppear() { AnytypeAnalytics.instance().logScreenWidget() } - + func widgetsDropUpdate(from: DropDataElement, to: DropDataElement) { widgetBlocks.move(fromOffsets: IndexSet(integer: from.index), toOffset: to.index) } @@ -140,7 +138,7 @@ final class HomeWidgetsViewModel { let blocks = widgetObject.children.filter(\.isWidget) recentStateManager.setupRecentStateIfNeeded(blocks: blocks, widgetObject: widgetObject) - var newWidgetBlocks = blocks + let newWidgetBlocks = blocks .compactMap { widgetObject.widgetInfo(block: $0) } guard widgetBlocks != newWidgetBlocks else { continue } @@ -150,7 +148,7 @@ final class HomeWidgetsViewModel { } private func startParticipantTask() async { - for await canEdit in accountParticipantStorage.canEditPublisher(spaceId: info.accountSpaceId).values { + for await canEdit in accountParticipantStorage.canEditSequence(spaceId: info.accountSpaceId) { homeState = canEdit ? .readwrite : .readonly canCreateObjectType = canEdit } @@ -158,12 +156,14 @@ final class HomeWidgetsViewModel { private func startObjectTypesTask() async { let spaceId = spaceId - + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType + let allowedLayouts = DetailsLayout.widgetTypeLayouts(spaceUxType: spaceUxType) + let stream = objectTypeProvider.objectTypesPublisher(spaceId: spaceId) .values .map { objects in let objects = objects - .filter { ($0.recommendedLayout.map { DetailsLayout.widgetTypeLayouts.contains($0) } ?? false) && !$0.isTemplateType } + .filter { ($0.recommendedLayout.map { allowedLayouts.contains($0) } ?? false) && !$0.isTemplateType } return objects.map { ObjectTypeWidgetInfo(objectTypeId: $0.id, spaceId: spaceId) } } .removeDuplicates() @@ -173,10 +173,4 @@ final class HomeWidgetsViewModel { objectTypeWidgets = objectTypes } } - - private func startSpaceViewTask() async { - for await showChat in workspaceStorage.spaceViewPublisher(spaceId: spaceId).map(\.canShowChatWidget).removeDuplicates().values { - chatWidgetData = showChat ? SpaceChatWidgetData(spaceId: spaceId, output: output) : nil - } - } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Builders/WidgetRowModelBuilder.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Builders/WidgetRowModelBuilder.swift new file mode 100644 index 0000000000..a05791b282 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Builders/WidgetRowModelBuilder.swift @@ -0,0 +1,81 @@ +import Foundation +import Services +import Factory + +@MainActor +protocol WidgetRowModelBuilderProtocol: AnyObject, Sendable { + func buildListRows( + from configs: [SetContentViewItemConfiguration], + spaceView: SpaceView?, + chatPreviews: [ChatMessagePreview] + ) -> [ListWidgetRowModel] + + func buildGalleryRows( + from configs: [SetContentViewItemConfiguration] + ) -> [GalleryWidgetRowModel] +} + +@MainActor +final class WidgetRowModelBuilder: WidgetRowModelBuilderProtocol, Sendable { + + private let dateFormatter = ChatPreviewDateFormatter() + + func buildGalleryRows( + from configs: [SetContentViewItemConfiguration] + ) -> [GalleryWidgetRowModel] { + configs.map { GalleryWidgetRowModel(details: $0) } + } + + func buildListRows( + from configs: [SetContentViewItemConfiguration], + spaceView: SpaceView?, + chatPreviews: [ChatMessagePreview] + ) -> [ListWidgetRowModel] { + configs.map { config in + let chatPreview = buildChatPreview( + objectId: config.id, + spaceView: spaceView, + chatPreviews: chatPreviews + ) + return ListWidgetRowModel(details: config, chatPreview: chatPreview) + } + } + + private func buildChatPreview( + objectId: String, + spaceView: SpaceView?, + chatPreviews: [ChatMessagePreview] + ) -> MessagePreviewModel? { + guard let preview = chatPreviews.first(where: { $0.chatId == objectId }), + let lastMessage = preview.lastMessage else { + return nil + } + + let attachments = lastMessage.attachments.prefix(3).map { objectDetails in + MessagePreviewModel.Attachment( + id: objectDetails.id, + icon: objectDetails.objectIconImage + ) + } + + let isMuted = !(spaceView?.effectiveNotificationMode(for: objectId).isUnmutedAll ?? true) + + return MessagePreviewModel( + creatorTitle: lastMessage.creator?.title, + text: lastMessage.text, + attachments: Array(attachments), + localizedAttachmentsText: lastMessage.localizedAttachmentsText, + chatPreviewDate: dateFormatter.localizedDateString(for: lastMessage.createdAt, showTodayTime: true), + unreadCounter: preview.unreadCounter, + mentionCounter: preview.mentionCounter, + isMuted: isMuted, + chatName: nil + ) + } +} + +extension Container { + var widgetRowModelBuilder: Factory { + self { WidgetRowModelBuilder() }.shared + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Common/LinkWidgetDefaultHeader.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Common/LinkWidgetDefaultHeader.swift index 251b06f35f..cd6b86ef2e 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Common/LinkWidgetDefaultHeader.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Common/LinkWidgetDefaultHeader.swift @@ -3,17 +3,20 @@ import SwiftUI struct LinkWidgetDefaultHeader: View { let title: String + let titleColor: Color let icon: Icon? let rightAccessory: RightView let onTap: (() -> Void) init( title: String, + titleColor: Color = .Text.primary, icon: Icon?, @ViewBuilder rightAccessory: () -> RightView = { EmptyView() }, onTap: @escaping () -> Void ) { self.title = title + self.titleColor = titleColor self.icon = icon self.rightAccessory = rightAccessory() self.onTap = onTap @@ -30,7 +33,7 @@ struct LinkWidgetDefaultHeader: View { Spacer.fixedWidth(16) } AnytypeText(title, style: .subheading) - .foregroundColor(.Text.primary) + .foregroundColor(titleColor) .lineLimit(1) .layoutPriority(-1) Spacer.fixedWidth(16) diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Container/WidgetContainerView.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Container/WidgetContainerView.swift index a21e0fa930..8dab34e9fc 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Container/WidgetContainerView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Container/WidgetContainerView.swift @@ -9,6 +9,7 @@ struct WidgetContainerView: View { let name: String let icon: Icon? + let badgeModel: MessagePreviewModel? let dragId: String? let onCreateObjectTap: (() -> Void)? let onHeaderTap: () -> Void @@ -20,6 +21,7 @@ struct WidgetContainerView: View { homeState: Binding, name: String, icon: Icon? = nil, + badgeModel: MessagePreviewModel? = nil, dragId: String?, menuItems: [WidgetMenuItem] = [.changeType, .remove, .removeSystemWidget], onCreateObjectTap: (() -> Void)?, @@ -30,6 +32,7 @@ struct WidgetContainerView: View { self._homeState = homeState self.name = name self.icon = icon + self.badgeModel = badgeModel self.dragId = dragId self.onCreateObjectTap = onCreateObjectTap self.onHeaderTap = onHeaderTap @@ -60,9 +63,29 @@ struct WidgetContainerView: View { allowContent: Content.self != EmptyView.self, createObjectAction: model.homeState.isReadWrite ? onCreateObjectTap : nil, header: { - LinkWidgetDefaultHeader(title: name, icon: icon, onTap: { - onHeaderTap() - }) + LinkWidgetDefaultHeader( + title: name, + titleColor: badgeModel?.titleColor ?? .Text.primary, + icon: icon, + rightAccessory: { + if let badgeModel, badgeModel.hasCounters { + HStack(spacing: 4) { + if badgeModel.mentionCounter > 0 { + MentionBadge(style: badgeModel.mentionStyle) + } + if badgeModel.unreadCounter > 0 { + CounterView( + count: badgeModel.unreadCounter, + style: badgeModel.unreadStyle + ) + } + } + } + }, + onTap: { + onHeaderTap() + } + ) }, menu: { menuItemsView diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetView.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetView.swift index 55de2d6c43..11e0bea9e8 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetView.swift @@ -29,6 +29,7 @@ struct LinkWidgetInternalView: View { homeState: data.homeState, name: model.name, icon: model.icon, + badgeModel: model.badgeModel, dragId: model.dragId, onCreateObjectTap: nil, onHeaderTap: { @@ -37,5 +38,8 @@ struct LinkWidgetInternalView: View { output: data.output, content: { EmptyView() } ) + .task { + await model.startSubscriptions() + } } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetViewModel.swift index 79afd5d3be..49b695ed0d 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/Link/LinkWidgetViewModel.swift @@ -2,6 +2,7 @@ import Foundation import Combine import Services import AnytypeCore +import Factory @MainActor @@ -12,21 +13,28 @@ final class LinkWidgetViewModel: ObservableObject { private let widgetBlockId: String private let widgetObject: any BaseDocumentProtocol private weak var output: (any CommonWidgetModuleOutput)? - + + @Injected(\.chatMessagesPreviewsStorage) + private var chatMessagesPreviewsStorage: any ChatMessagesPreviewsStorageProtocol + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + // MARK: - State - private var subscriptions = [AnyCancellable]() private var linkedObjectDetails: ObjectDetails? - + private var chatPreviews: [ChatMessagePreview] = [] + @Published private(set) var name = "" @Published private(set) var icon: Icon? + @Published private(set) var badgeModel: MessagePreviewModel? var dragId: String? { widgetBlockId } - + + private let dateFormatter = ChatPreviewDateFormatter() + init(data: WidgetSubmoduleData) { self.widgetBlockId = data.widgetBlockId self.widgetObject = data.widgetObject self.output = data.output - setupAllSubscriptions() } func onHeaderTap() { @@ -39,17 +47,63 @@ final class LinkWidgetViewModel: ObservableObject { output?.onObjectSelected(screenData: linkedObjectDetails.screenData()) } + func startSubscriptions() async { + async let detailsSub: () = startDetailsSubscriptions() + async let chatPreviewsSub: () = startChatPreviewsSubscription() + + _ = await (detailsSub, chatPreviewsSub) + } + // MARK: - Private - private func setupAllSubscriptions() { - - widgetObject.widgetTargetDetailsPublisher(widgetBlockId: widgetBlockId) - .receiveOnMain() - .sink { [weak self] details in - self?.linkedObjectDetails = details - self?.name = details.pluralTitle - self?.icon = details.objectIconImage - } - .store(in: &subscriptions) + private func startDetailsSubscriptions() async { + for await details in widgetObject.widgetTargetDetailsPublisher(widgetBlockId: widgetBlockId).values { + linkedObjectDetails = details + name = details.pluralTitle + icon = details.objectIconImage + updateBadgeModel() + } + } + + private func startChatPreviewsSubscription() async { + for await previews in await chatMessagesPreviewsStorage.previewsSequence { + chatPreviews = previews + updateBadgeModel() + } + } + + private func updateBadgeModel() { + guard let linkedObjectDetails else { + badgeModel = nil + return + } + + guard let chatPreview = chatPreviews.first(where: { $0.chatId == linkedObjectDetails.id }), + let lastMessage = chatPreview.lastMessage else { + badgeModel = nil + return + } + + let attachments = lastMessage.attachments.prefix(3).map { objectDetails in + MessagePreviewModel.Attachment( + id: objectDetails.id, + icon: objectDetails.objectIconImage + ) + } + + let spaceView = spaceViewsStorage.spaceView(spaceId: linkedObjectDetails.spaceId) + let isMuted = !(spaceView?.effectiveNotificationMode(for: linkedObjectDetails.id).isUnmutedAll ?? true) + + badgeModel = MessagePreviewModel( + creatorTitle: lastMessage.creator?.title, + text: lastMessage.text, + attachments: Array(attachments), + localizedAttachmentsText: lastMessage.localizedAttachmentsText, + chatPreviewDate: dateFormatter.localizedDateString(for: lastMessage.createdAt, showTodayTime: true), + unreadCounter: chatPreview.unreadCounter, + mentionCounter: chatPreview.mentionCounter, + isMuted: isMuted, + chatName: nil + ) } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetCompactRow.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetCompactRow.swift index 6f1946e002..b2a01e187b 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetCompactRow.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetCompactRow.swift @@ -7,16 +7,35 @@ struct ListWidgetCompactRow: View { let showDivider: Bool @Environment(\.editMode) private var editMode - + + private var titleColor: Color { + model.chatPreview?.titleColor ?? .Text.primary + } + var body: some View { HStack(spacing: 12) { IconView(icon: model.icon) .frame(width: 18, height: 18) - + AnytypeText(model.title, style: .previewTitle2Medium) - .foregroundColor(.Text.primary) + .foregroundColor(titleColor) .lineLimit(1) + Spacer() + + if let chatPreview = model.chatPreview, chatPreview.hasCounters { + HStack(spacing: 4) { + if chatPreview.mentionCounter > 0 { + MentionBadge(style: chatPreview.mentionStyle) + } + if chatPreview.unreadCounter > 0 { + CounterView( + count: chatPreview.unreadCounter, + style: chatPreview.unreadStyle + ) + } + } + } } .padding(.horizontal, 16) .frame(height: 40) diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRow.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRow.swift index 6989453357..67c80dc2db 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRow.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRow.swift @@ -9,21 +9,18 @@ struct ListWidgetRow: View { @Environment(\.editMode) private var editMode var body: some View { - HStack(spacing: 12) { + HStack(spacing: 0) { IconView(icon: model.icon) .frame(width: 48, height: 48) - VStack(alignment: .leading, spacing: 0) { - AnytypeText(model.title, style: .previewTitle2Medium) - .foregroundColor(.Text.primary) - .lineLimit(1) - if let description = model.description, description.isNotEmpty { - Spacer.fixedHeight(1) - AnytypeText(description, style: .relation3Regular) - .foregroundColor(.Widget.secondary) - .lineLimit(1) - } + Spacer.fixedWidth(12) + + if let chatPreview = model.chatPreview { + chatContent(chatPreview: chatPreview) + } else { + regularContent } + Spacer() } .padding(.horizontal, 16) @@ -37,4 +34,58 @@ struct ListWidgetRow: View { } .id(model.objectId) } + + @ViewBuilder + private var regularContent: some View { + VStack(alignment: .leading, spacing: 0) { + AnytypeText(model.title, style: .previewTitle2Medium) + .foregroundColor(.Text.primary) + .lineLimit(1) + if let description = model.description, description.isNotEmpty { + Spacer.fixedHeight(1) + AnytypeText(description, style: .relation3Regular) + .foregroundColor(.Widget.secondary) + .lineLimit(1) + } + } + } + + @ViewBuilder + private func chatContent(chatPreview: MessagePreviewModel) -> some View { + VStack(alignment: .leading, spacing: 1) { + HStack(spacing: 0) { + AnytypeText(model.title, style: .previewTitle2Medium) + .foregroundColor(chatPreview.titleColor) + .lineLimit(1) + + Spacer() + + AnytypeText(chatPreview.chatPreviewDate, style: .relation3Regular) + .foregroundColor(.Text.secondary) + .lineLimit(1) + } + + HStack(spacing: 0) { + AnytypeText(chatPreview.messagePreviewText, style: .relation2Regular) + .foregroundColor(chatPreview.messagePreviewColor) + .lineLimit(1) + + Spacer() + + if chatPreview.hasCounters { + HStack(spacing: 4) { + if chatPreview.mentionCounter > 0 { + MentionBadge(style: chatPreview.mentionStyle) + } + if chatPreview.unreadCounter > 0 { + CounterView( + count: chatPreview.unreadCounter, + style: chatPreview.unreadStyle + ) + } + } + } + } + } + } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel+ObjectDetails.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel+ObjectDetails.swift index cec6b4f324..58c75e97be 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel+ObjectDetails.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel+ObjectDetails.swift @@ -5,6 +5,7 @@ extension ListWidgetRowModel { init( details: ObjectDetails, + chatPreview: MessagePreviewModel? = nil, onTap: @escaping @MainActor (ScreenData) -> Void ) { self = ListWidgetRowModel( @@ -12,18 +13,20 @@ extension ListWidgetRowModel { icon: details.objectIconImage, title: details.pluralTitle, description: details.subtitle, + chatPreview: chatPreview, onTap: { onTap(details.screenData()) } ) } - - init(details: SetContentViewItemConfiguration) { + + init(details: SetContentViewItemConfiguration, chatPreview: MessagePreviewModel? = nil) { self = ListWidgetRowModel( objectId: details.id, icon: details.icon, title: details.title, description: details.description, + chatPreview: chatPreview, onTap: details.onItemTap ) } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel.swift index eb78db9a5c..02f01de5ea 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/List/Common/Content/Subviews/ListWidgetRowModel.swift @@ -5,6 +5,7 @@ struct ListWidgetRowModel: Identifiable { let icon: Icon let title: String let description: String? + let chatPreview: MessagePreviewModel? let onTap: @MainActor () -> Void var id: String { objectId } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/Helpers/ObjectTypeRowsBuilder.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/Helpers/ObjectTypeRowsBuilder.swift index 0cce636228..70f130337a 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/Helpers/ObjectTypeRowsBuilder.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/Helpers/ObjectTypeRowsBuilder.swift @@ -11,9 +11,9 @@ protocol ObjectTypeRowsBuilderProtocol: AnyObject, Sendable { } actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { - + private let info: ObjectTypeWidgetInfo - + @LazyInjected(\.openedDocumentProvider) private var openedDocumentProvider: any OpenedDocumentsProviderProtocol @LazyInjected(\.objectTypeProvider) @@ -24,14 +24,21 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { private var setObjectWidgetOrderHelper: any SetObjectWidgetOrderHelperProtocol @LazyInjected(\.subscriptionStorageProvider) private var subscriptionStorageProvider: any SubscriptionStorageProviderProtocol - + @LazyInjected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + @LazyInjected(\.chatMessagesPreviewsStorage) + private var chatMessagesPreviewsStorage: any ChatMessagesPreviewsStorageProtocol + @LazyInjected(\.widgetRowModelBuilder) + private var widgetRowModelBuilder: any WidgetRowModelBuilderProtocol + private lazy var subscriptionStorage: any SubscriptionStorageProtocol = { subscriptionStorageProvider.createSubscriptionStorage(subId: subscriptionId) }() - + private let subscriptionId = "ObjectTypeWidget-\(UUID().uuidString)" private var isImageType: Bool = false - + private var chatPreviews: [ChatMessagePreview] = [] + private let rowsChannel = AsyncChannel() private var onTap: (@MainActor (_ details: ObjectDetails) -> Void)? @@ -56,8 +63,9 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { func startSubscriptions() async { async let typeSub: () = startTypeSubscription() async let objectSub: () = startObjectsSubscription() - - _ = await (typeSub, objectSub) + async let chatPreviewsSub: () = startChatPreviewsSubscription() + + _ = await (typeSub, objectSub, chatPreviewsSub) } private func startTypeSubscription() async { @@ -65,13 +73,20 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { isImageType = type.isImageLayout } } - + + private func startChatPreviewsSubscription() async { + for await previews in await chatMessagesPreviewsStorage.previewsSequenceWithEmpty { + chatPreviews = previews + } + } + // MARK: - Private private func startObjectsSubscription() async { do { try await setDocument.open() - + + let spaceUxType = await spaceViewsStorage.spaceView(spaceId: setDocument.spaceId)?.uxType let subscriptionData = setSubscriptionDataBuilder.set( SetSubscriptionData( identifier: subscriptionId, @@ -80,17 +95,21 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { currentPage: 0, numberOfRowsPerPage: 6, collectionId: nil, - objectOrderIds: setDocument.objectOrderIds(for: setSubscriptionDataBuilder.subscriptionId) + objectOrderIds: setDocument.objectOrderIds(for: setSubscriptionDataBuilder.subscriptionId), + spaceUxType: spaceUxType ) ) try await subscriptionStorage.startOrUpdateSubscription(data: subscriptionData) for await state in subscriptionStorage.statePublisher.values { + let spaceView = await spaceViewsStorage.spaceView(spaceId: setDocument.spaceId) let rowDetails = setObjectWidgetOrderHelper.reorder( setDocument: setDocument, subscriptionStorage: subscriptionStorage, details: state.items, + chatPreviews: chatPreviews, + spaceView: spaceView, onItemTap: { [weak self] details, _ in Task { let onTap = await self?.onTap @@ -98,13 +117,13 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { } } ) - await updateRows(rowDetails: rowDetails, availableMoreObjects: state.total > state.items.count) + await updateRows(rowDetails: rowDetails, spaceView: spaceView, availableMoreObjects: state.total > state.items.count) } } catch {} } - private func updateRows(rowDetails: [SetContentViewItemConfiguration], availableMoreObjects: Bool) async { + private func updateRows(rowDetails: [SetContentViewItemConfiguration], spaceView: SpaceView?, availableMoreObjects: Bool) async { let rows: ObjectTypeWidgetRowType if isImageType { let galleryRows = rowDetails.map { details in @@ -120,14 +139,18 @@ actor ObjectTypeRowsBuilder: ObjectTypeRowsBuilderProtocol { } else { switch setDocument.activeView.type { case .table, .list, .kanban, .calendar, .graph: - let listRows = rowDetails.map { ListWidgetRowModel(details: $0) } + let listRows = await widgetRowModelBuilder.buildListRows( + from: rowDetails, + spaceView: spaceView, + chatPreviews: chatPreviews + ) rows = .compactList(rows: listRows, availableMoreObjects: availableMoreObjects) case .gallery: let galleryRows = rowDetails.map { GalleryWidgetRowModel(details: $0) } rows = .gallery(rows: galleryRows, availableMoreObjects: availableMoreObjects) } } - + await rowsChannel.send(rows) } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/ObjectTypeWidgetViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/ObjectTypeWidgetViewModel.swift index 97956b3110..cda3d79662 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/ObjectTypeWidgetViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/ObjectType/ObjectTypeWidgetViewModel.swift @@ -103,7 +103,7 @@ final class ObjectTypeWidgetViewModel { } private func startParticipantSubscription() async { - for await canEdit in accountParticipantsStorage.canEditPublisher(spaceId: info.spaceId).values { + for await canEdit in accountParticipantsStorage.canEditSequence(spaceId: info.spaceId) { self.canEdit = canEdit } } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SetCommon/SetObjectWidgetOrderHelper.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SetCommon/SetObjectWidgetOrderHelper.swift index 1699074ad3..39930b4c98 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SetCommon/SetObjectWidgetOrderHelper.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SetCommon/SetObjectWidgetOrderHelper.swift @@ -6,6 +6,8 @@ protocol SetObjectWidgetOrderHelperProtocol: AnyObject { setDocument: any SetDocumentProtocol, subscriptionStorage: any SubscriptionStorageProtocol, details: [ObjectDetails], + chatPreviews: [ChatMessagePreview], + spaceView: SpaceView?, onItemTap: @escaping @MainActor (_ details: ObjectDetails, _ allDetails: [ObjectDetails]) -> Void ) -> [SetContentViewItemConfiguration] } @@ -19,9 +21,11 @@ final class SetObjectWidgetOrderHelper: SetObjectWidgetOrderHelperProtocol { setDocument: any SetDocumentProtocol, subscriptionStorage: any SubscriptionStorageProtocol, details: [ObjectDetails], + chatPreviews: [ChatMessagePreview], + spaceView: SpaceView?, onItemTap: @escaping @MainActor (_ details: ObjectDetails, _ allDetails: [ObjectDetails]) -> Void ) -> [SetContentViewItemConfiguration] { - + let sortedDetails: [ObjectDetails] let objectOrderIds = setDocument.objectOrderIds(for: "") if objectOrderIds.isNotEmpty { @@ -29,7 +33,7 @@ final class SetObjectWidgetOrderHelper: SetObjectWidgetOrderHelperProtocol { } else { sortedDetails = details } - + return setContentViewDataBuilder.itemData( sortedDetails, dataView: setDocument.dataView, @@ -38,6 +42,8 @@ final class SetObjectWidgetOrderHelper: SetObjectWidgetOrderHelperProtocol { canEditIcon: setDocument.setPermissions.canEditSetObjectIcon, storage: subscriptionStorage.detailsStorage, spaceId: setDocument.spaceId, + chatPreviews: chatPreviews, + spaceView: spaceView, onItemTap: { onItemTap($0, sortedDetails) } diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetData.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetData.swift deleted file mode 100644 index 370361b8d4..0000000000 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetData.swift +++ /dev/null @@ -1,8 +0,0 @@ -import Foundation -import SwiftUI -import Services - -struct SpaceChatWidgetData { - let spaceId: String - let output: (any CommonWidgetModuleOutput)? -} diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetView.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetView.swift deleted file mode 100644 index f2f0f29f73..0000000000 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetView.swift +++ /dev/null @@ -1,44 +0,0 @@ -import Foundation -import SwiftUI -import AnytypeCore - -struct SpaceChatWidgetView: View { - - @StateObject private var model: SpaceChatWidgetViewModel - - init(data: SpaceChatWidgetData) { - self._model = StateObject(wrappedValue: SpaceChatWidgetViewModel(data: data)) - } - - var body: some View { - LinkWidgetViewContainer( - isExpanded: .constant(false), - dragId: nil, - homeState: .constant(.readwrite), - allowContent: false, - header: { - LinkWidgetDefaultHeader( - title: Loc.chat, - icon: .asset(.X24.chat), - rightAccessory: { - HStack(spacing: 4) { - if model.hasMentions { - MentionBadge(style: model.muted ? .muted : .highlighted) - } - if model.messageCount > 0 { - CounterView(count: model.messageCount, style: model.muted ? .muted : .highlighted) - } - } - }, - onTap: { - model.onHeaderTap() - } - ) - }, - content: { EmptyView() } - ) - .task { - await model.startSubscriptions() - } - } -} diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetViewModel.swift deleted file mode 100644 index 6e5982c137..0000000000 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpaceChat/SpaceChatWidgetViewModel.swift +++ /dev/null @@ -1,50 +0,0 @@ -import Foundation -import Combine -import Services -import AnytypeCore - -@MainActor -final class SpaceChatWidgetViewModel: ObservableObject { - - @Injected(\.spaceViewsStorage) - private var workspaceStorage: any SpaceViewsStorageProtocol - @Injected(\.chatMessagesPreviewsStorage) - private var chatMessagesPreviewsStorage: any ChatMessagesPreviewsStorageProtocol - @Injected(\.widgetActionsViewCommonMenuProvider) - private var widgetActionsViewCommonMenuProvider: any WidgetActionsViewCommonMenuProviderProtocol - - private let data: SpaceChatWidgetData - - @Published var hasMentions: Bool = false - @Published var messageCount: Int = 0 - @Published var muted = false - - private weak var output: (any CommonWidgetModuleOutput)? { data.output } - - init(data: SpaceChatWidgetData) { - self.data = data - } - - func onHeaderTap() { - guard let chatId = workspaceStorage.spaceView(spaceId: data.spaceId)?.chatId, chatId.isNotEmpty else { return } - AnytypeAnalytics.instance().logClickWidgetTitle(source: .chat, createType: .manual) - data.output?.onObjectSelected(screenData: .spaceChat(SpaceChatCoordinatorData(spaceId: data.spaceId))) - } - - func startSubscriptions() async { - let spaceId = data.spaceId - let spaceView = workspaceStorage.spaceView(spaceId: spaceId) - muted = FeatureFlags.muteSpacePossibility && !(spaceView?.pushNotificationMode.isUnmutedAll ?? true) - - let chatId = spaceView?.chatId - let sequence = (await chatMessagesPreviewsStorage.previewsSequence) - .compactMap { $0.first { $0.spaceId == spaceId && $0.chatId == chatId }} - .removeDuplicates() - .throttle(milliseconds: 300) - - for await counters in sequence { - messageCount = counters.unreadCounter - hasMentions = counters.mentionCounter > 0 - } - } -} diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/WidgetDataviewInternalViewModelProtocol.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/Models/WidgetDataviewInternalViewModelProtocol.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/WidgetDataviewInternalViewModelProtocol.swift rename to Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/Models/WidgetDataviewInternalViewModelProtocol.swift diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/WidgetInternalViewModelProtocol.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/Models/WidgetInternalViewModelProtocol.swift similarity index 100% rename from Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/WidgetInternalViewModelProtocol.swift rename to Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/Models/WidgetInternalViewModelProtocol.swift diff --git a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/SetObjectWidgetInternalViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/SetObjectWidgetInternalViewModel.swift index c2f8f30a71..0f3b659d13 100644 --- a/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/SetObjectWidgetInternalViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/HomeWidgets/Widgets/SpecificInternalModels/SetObjectWidgetInternalViewModel.swift @@ -31,7 +31,13 @@ final class SetObjectWidgetInternalViewModel { private var objectTypeProvider: any ObjectTypeProviderProtocol @Injected(\.setObjectWidgetOrderHelper) @ObservationIgnored private var setObjectWidgetOrderHelper: any SetObjectWidgetOrderHelperProtocol - + @Injected(\.spaceViewsStorage) @ObservationIgnored + private var spaceViewsStorage: any SpaceViewsStorageProtocol + @Injected(\.chatMessagesPreviewsStorage) @ObservationIgnored + private var chatMessagesPreviewsStorage: any ChatMessagesPreviewsStorageProtocol + @Injected(\.widgetRowModelBuilder) @ObservationIgnored + private var widgetRowModelBuilder: any WidgetRowModelBuilderProtocol + // MARK: - State @ObservationIgnored private var widgetInfo: BlockWidgetInfo? @@ -41,6 +47,8 @@ final class SetObjectWidgetInternalViewModel { private var activeViewId: String? @ObservationIgnored private var canEditBlocks = true + @ObservationIgnored + private var chatPreviews: [ChatMessagePreview] = [] var dragId: String? { widgetBlockId } @@ -66,8 +74,9 @@ final class SetObjectWidgetInternalViewModel { async let permissionsTask: () = startPermissionsPublisher() async let startInfoTask: () = startInfoPublisher() async let targetDetailsTask: () = startTargetDetailsPublisher() - - _ = await (permissionsTask, startInfoTask, targetDetailsTask) + async let chatPreviewsTask: () = startChatPreviewsSequence() + + _ = await (permissionsTask, startInfoTask, targetDetailsTask, chatPreviewsTask) } // MARK: - Actions @@ -125,6 +134,13 @@ final class SetObjectWidgetInternalViewModel { await updateSetDocument(objectId: details.id, spaceId: details.spaceId) } } + + private func startChatPreviewsSequence() async { + for await previews in await chatMessagesPreviewsStorage.previewsSequence { + chatPreviews = previews + await updateBodyState() + } + } // MARK: - Private for view updates @@ -134,36 +150,39 @@ final class SetObjectWidgetInternalViewModel { switch style { case .list: - let listRows = rowDetails?.map { ListWidgetRowModel(details: $0) } + let listRows = buildListRows(from: rowDetails) rows = .list(rows: listRows, id: activeViewId ?? "") case .compactList: - let listRows = rowDetails?.map { ListWidgetRowModel(details: $0) } + let listRows = buildListRows(from: rowDetails) rows = .compactList(rows: listRows, id: activeViewId ?? "") case .view: if isSetByImageType() { - let galleryRows = rowDetails?.map { details in - GalleryWidgetRowModel( - objectId: details.id, - title: nil, - icon: nil, - cover: .cover(.imageId(details.id)), - onTap: details.onItemTap - ) - } + let galleryRows = rowDetails.map { widgetRowModelBuilder.buildGalleryRows(from: $0) } rows = .gallery(rows: galleryRows, id: activeViewId ?? "") } else { switch setDocument?.activeView.type { case .table, .list, .kanban, .calendar, .graph, nil: - let listRows = rowDetails?.map { ListWidgetRowModel(details: $0) } + let listRows = buildListRows(from: rowDetails) rows = .compactList(rows: listRows, id: activeViewId ?? "") case .gallery: - let galleryRows = rowDetails?.map { GalleryWidgetRowModel(details: $0) } + let galleryRows = rowDetails.map { widgetRowModelBuilder.buildGalleryRows(from: $0) } rows = .gallery(rows: galleryRows, id: activeViewId ?? "") } } } } } + + private func buildListRows(from configs: [SetContentViewItemConfiguration]?) -> [ListWidgetRowModel]? { + guard let configs, let setDocument else { return nil } + let spaceView = spaceViewsStorage.spaceView(spaceId: setDocument.spaceId) + + return widgetRowModelBuilder.buildListRows( + from: configs, + spaceView: spaceView, + chatPreviews: chatPreviews + ) + } private func isSetByImageType() -> Bool { guard let details = setDocument?.details, @@ -207,7 +226,8 @@ final class SetObjectWidgetInternalViewModel { } guard setDocument.canStartSubscription() else { return } - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: setDocument.spaceId)?.uxType let subscriptionData = setSubscriptionDataBuilder.set( SetSubscriptionData( identifier: subscriptionId, @@ -216,7 +236,8 @@ final class SetObjectWidgetInternalViewModel { currentPage: 0, numberOfRowsPerPage: widgetInfo.fixedLimit, collectionId: setDocument.isCollection() ? setDocument.objectId : nil, - objectOrderIds: setDocument.objectOrderIds(for: setSubscriptionDataBuilder.subscriptionId) + objectOrderIds: setDocument.objectOrderIds(for: setSubscriptionDataBuilder.subscriptionId), + spaceUxType: spaceUxType ) ) @@ -276,13 +297,16 @@ final class SetObjectWidgetInternalViewModel { private func updateRowDetails(data: SubscriptionStorageState) { guard let setDocument else { return } - + availableMoreObjects = data.total > data.items.count - + + let spaceView = spaceViewsStorage.spaceView(spaceId: setDocument.spaceId) let rowDetails = setObjectWidgetOrderHelper.reorder( setDocument: setDocument, subscriptionStorage: subscriptionStorage, details: data.items, + chatPreviews: chatPreviews, + spaceView: spaceView, onItemTap: { [weak self] details, sortedDetails in self?.handleTapOnObject(details: details, allDetails: sortedDetails) } @@ -294,7 +318,7 @@ final class SetObjectWidgetInternalViewModel { guard let info = widgetObject.widgetInfo(blockId: widgetBlockId) else { return } AnytypeAnalytics.instance().logOpenSidebarObject(createType: info.widgetCreateType) let isAllMediaFiles = allDetails.allSatisfy { $0.editorViewType.isMediaFile } - if FeatureFlags.mediaCarouselForWidgets, isAllMediaFiles { + if isAllMediaFiles { output?.onObjectSelected(screenData: .preview( MediaFileScreenData(selectedItem: details, allItems: allDetails, route: .widget) )) diff --git a/Anytype/Sources/PresentationLayer/Modules/PublishToWeb/PublishToWebInternalViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/PublishToWeb/PublishToWebInternalViewModel.swift index 47bd029415..39566ebeb5 100644 --- a/Anytype/Sources/PresentationLayer/Modules/PublishToWeb/PublishToWebInternalViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/PublishToWeb/PublishToWebInternalViewModel.swift @@ -64,11 +64,6 @@ final class PublishToWebInternalViewModel: ObservableObject, PublishingPreviewOu AnytypeAnalytics.instance().logClickShareObjectUpdate(objectType: analyticsObjectType) } - let encodedPath = customPath - .removingPercentEncoding? - .addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? customPath - customPath = encodedPath - try await publishingService.create(spaceId: spaceId, objectId: objectId, uri: customPath, joinSpace: showJoinSpaceButton) status = try await publishingService.getStatus(spaceId: spaceId, objectId: objectId) diff --git a/Anytype/Sources/PresentationLayer/Modules/ServerConfiguration/ServerConfigurationView.swift b/Anytype/Sources/PresentationLayer/Modules/ServerConfiguration/ServerConfigurationView.swift index ea27d4dd47..599aa0348f 100644 --- a/Anytype/Sources/PresentationLayer/Modules/ServerConfiguration/ServerConfigurationView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/ServerConfiguration/ServerConfigurationView.swift @@ -37,7 +37,7 @@ struct ServerConfigurationView: View { StandardButton( Loc.Server.addButton, - style: FeatureFlags.brandNewAuthFlow ? .secondaryOvalLarge : .secondaryMedium) + style: .secondaryLarge) { model.onTapAddServer() } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/ParticipantSpaceViewDataWithPreview.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/ParticipantSpaceViewDataWithPreview.swift index bb97d4e0f4..b84b28146e 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/ParticipantSpaceViewDataWithPreview.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/ParticipantSpaceViewDataWithPreview.swift @@ -4,21 +4,33 @@ import StoredHashMacro @StoredHash struct ParticipantSpaceViewDataWithPreview: Equatable, Identifiable, Hashable { let space: ParticipantSpaceViewData - let preview: ChatMessagePreview - + let latestPreview: ChatMessagePreview + let totalUnreadCounter: Int + let totalMentionCounter: Int + var id: String { space.id } - + var spaceView: SpaceView { space.spaceView } - - var hasCounters: Bool { preview.unreadCounter > 0 || preview.mentionCounter > 0 } - - func updated(preview: ChatMessagePreview) -> Self { - ParticipantSpaceViewDataWithPreview(space: space, preview: preview) + + var hasCounters: Bool { totalUnreadCounter > 0 || totalMentionCounter > 0 } + + func updated(latestPreview: ChatMessagePreview, totalUnread: Int, totalMentions: Int) -> Self { + ParticipantSpaceViewDataWithPreview( + space: space, + latestPreview: latestPreview, + totalUnreadCounter: totalUnread, + totalMentionCounter: totalMentions + ) } } extension ParticipantSpaceViewDataWithPreview { init(space: ParticipantSpaceViewData) { - self.init(space: space, preview: ChatMessagePreview(spaceId: space.id, chatId: space.spaceView.chatId)) + self.init( + space: space, + latestPreview: ChatMessagePreview(spaceId: space.id, chatId: space.spaceView.chatId), + totalUnreadCounter: 0, + totalMentionCounter: 0 + ) } } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/SpaceHubSpacesStorage.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/SpaceHubSpacesStorage.swift index 54a22c2db9..315f24f754 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/SpaceHubSpacesStorage.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Helpers/SpaceHubSpacesStorage.swift @@ -26,19 +26,29 @@ actor SpaceHubSpacesStorage: SpaceHubSpacesStorageProtocol { ).throttle(milliseconds: 300) return combineStream.map { (spaces, previews) in - var spaces = spaces.map { ParticipantSpaceViewDataWithPreview(space: $0) } - - for preview in previews { - if let spaceIndex = spaces.firstIndex(where: { $0.spaceView.targetSpaceId == preview.spaceId }) { - let participantSpace = spaces[spaceIndex] - - if participantSpace.spaceView.chatId == preview.chatId { - spaces[spaceIndex] = spaces[spaceIndex].updated(preview: preview) + spaces.map { space in + let spacePreviews = previews.filter { $0.spaceId == space.spaceView.targetSpaceId } + + guard let latestPreview = spacePreviews.max(by: { preview1, preview2 in + guard let date1 = preview1.lastMessage?.createdAt, + let date2 = preview2.lastMessage?.createdAt else { + return preview1.lastMessage == nil } + return date1 < date2 + }) else { + return ParticipantSpaceViewDataWithPreview(space: space) } + + let totalUnread = spacePreviews.reduce(0) { $0 + $1.unreadCounter } + let totalMentions = spacePreviews.reduce(0) { $0 + $1.mentionCounter } + + return ParticipantSpaceViewDataWithPreview( + space: space, + latestPreview: latestPreview, + totalUnreadCounter: totalUnread, + totalMentionCounter: totalMentions + ) } - - return spaces } .removeDuplicates() .eraseToAnyAsyncSequence() diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubDropDelegate.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubDropDelegate.swift index 585859bcaa..1bd4e174c2 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubDropDelegate.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubDropDelegate.swift @@ -5,9 +5,9 @@ import AnytypeCore struct SpaceHubDropDelegate: DropDelegate { - let destinationItem: ParticipantSpaceViewDataWithPreview + let destinationSpaceViewId: String? @Binding var allSpaces: [ParticipantSpaceViewDataWithPreview]? - @Binding var draggedItem: ParticipantSpaceViewDataWithPreview? + @Binding var draggedSpaceViewId: String? @Binding var initialIndex: Int? func dropUpdated(info: DropInfo) -> DropProposal? { @@ -15,20 +15,20 @@ struct SpaceHubDropDelegate: DropDelegate { } func performDrop(info: DropInfo) -> Bool { - guard let allSpaces, draggedItem.isNotNil, let initialIndex else { return false } + guard let allSpaces, draggedSpaceViewId.isNotNil, let initialIndex else { return false } - guard let finalIndex = allSpaces.firstIndex(of: destinationItem) else { return false } + guard let finalIndex = allSpaces.firstIndex(where: { $0.spaceView.id == destinationSpaceViewId }) else { return false } guard finalIndex != initialIndex else { return false } - self.draggedItem = nil + self.draggedSpaceViewId = nil self.initialIndex = nil return true } func dropEntered(info: DropInfo) { - guard var allSpaces, let draggedItem else { return } - guard let fromIndex = allSpaces.firstIndex(where: { $0.space.id == draggedItem.space.id } ) else { return } - guard let toIndex = allSpaces.firstIndex(where: { $0.space.id == destinationItem.space.id } ) else { return } + guard var allSpaces, let draggedSpaceViewId else { return } + guard let fromIndex = allSpaces.firstIndex(where: { $0.space.spaceView.id == draggedSpaceViewId } ) else { return } + guard let toIndex = allSpaces.firstIndex(where: { $0.space.spaceView.id == destinationSpaceViewId } ) else { return } guard fromIndex != toIndex else { return } @@ -52,7 +52,7 @@ struct SpaceHubDropDelegate: DropDelegate { let spaceOrderService = Container.shared.spaceOrderService() try await spaceOrderService.setOrder( - spaceViewIdMoved: draggedItem.spaceView.id, newOrder: newOrder + spaceViewIdMoved: draggedSpaceViewId, newOrder: newOrder ) AnytypeAnalytics.instance().logReorderSpace() } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubView.swift index 4d54cf026c..c965e83bf5 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubView.swift @@ -4,15 +4,12 @@ import DesignKit struct SpaceHubView: View { - @StateObject private var model: SpaceHubViewModel - - @State private var draggedSpace: ParticipantSpaceViewDataWithPreview? - @State private var draggedInitialIndex: Int? + @State private var model: SpaceHubViewModel private var namespace: Namespace.ID init(output: (any SpaceHubModuleOutput)?, namespace: Namespace.ID) { - _model = StateObject(wrappedValue: SpaceHubViewModel(output: output)) + _model = State(wrappedValue: SpaceHubViewModel(output: output)) self.namespace = namespace } @@ -34,8 +31,8 @@ struct SpaceHubView: View { @ViewBuilder private var content: some View { Group { - if let spaces = model.spaces { - spacesView(spaces) + if model.dataLoaded { + spacesView() } else { EmptyView() // Do not show empty state view if we do not receive data yet } @@ -43,211 +40,33 @@ struct SpaceHubView: View { Spacer() } .ignoresSafeArea(edges: .bottom) - .animation(.default, value: model.spaces) } - private func spacesView(_ spaces: [ParticipantSpaceViewDataWithPreview]) -> some View { + private func spacesView() -> some View { NavigationStack { - Group { - if spaces.isEmpty { - emptyStateView - } else if model.filteredSpaces.isNotEmpty { - scrollView - } else { - searchEmptyStateView + SpaceHubList(model: model) + .navigationTitle(Loc.myChannels) + .scrollEdgeEffectStyleIOS26(.soft, for: .top) + .toolbar { toolbarItems } + .searchable(text: $model.searchText) + .onChange(of: model.searchText) { + model.searchTextUpdated() } - } - .navigationTitle(Loc.myChannels) - .navigationBarTitleDisplayMode(.inline) - .toolbar { toolbarItems } - .searchable(text: $model.searchText) }.tint(Color.Text.secondary) } - private var scrollView: some View { - ScrollView { - VStack(spacing: FeatureFlags.vaultBackToRoots ? 8 : 0) { - HomeUpdateSubmoduleView().padding(8) - - ForEach(model.filteredSpaces) { - spaceCard($0) - } - - Spacer.fixedHeight(40) - } - } - } - - @ToolbarContentBuilder private var toolbarItems: some ToolbarContent { - if #available(iOS 26.0, *) { - ios26ToolbarItems - } else { - legacyToolbarItems - } - } - - @ToolbarContentBuilder - private var legacyToolbarItems: some ToolbarContent { - ToolbarItem(placement: .principal) { - HStack(spacing: 6) { - if model.showLoading { - CircleLoadingView(.Text.primary) - .frame(width: 18, height: 18) - .transition(.scale.combined(with: .opacity)) - } else { - Spacer.fixedWidth(18) - } - - AnytypeText(Loc.myChannels, style: .uxTitle1Semibold) - - Spacer.fixedWidth(18) - } - } - - - ToolbarItem(placement: .topBarLeading) { - Button { - model.onTapSettings() - } label: { - IconView(icon: model.profileIcon) - .foregroundStyle(Color.Control.secondary) - .frame(width: 28, height: 28) - .overlay(alignment: .topTrailing) { - if model.notificationsDenied { - attentionDotView - } - } - .padding(.vertical, 8) - } - } - - ToolbarItem(placement: .topBarTrailing) { - SpaceHubNewSpaceButton { + SpaceHubToolbar( + profileIcon: model.profileIcon, + notificationsDenied: model.notificationsDenied, + namespace: namespace, + onTapCreateSpace: { model.onTapCreateSpace() - } - } - } - - @available(iOS 26.0, *) - @ToolbarContentBuilder - private var ios26ToolbarItems: some ToolbarContent { - ToolbarItem(placement: .principal) { - HStack(spacing: 6) { - if model.showLoading { - CircleLoadingView(.Text.primary) - .frame(width: 18, height: 18) - .transition(.scale.combined(with: .opacity)) - } else { - Spacer.fixedWidth(18) - } - - AnytypeText(Loc.myChannels, style: .uxTitle1Semibold) - - Spacer.fixedWidth(18) - } - } - - ToolbarItem(placement: .topBarTrailing) { - Button { - model.onTapSettings() - } label: { - IconView(icon: model.profileIcon) - .foregroundStyle(Color.Control.secondary) - .frame(width: 28, height: 28) - .overlay(alignment: .topTrailing) { - if model.notificationsDenied { - attentionDotView - } - } - .padding(.vertical, 8) - } - } - - DefaultToolbarItem(kind: .search, placement: .bottomBar) - - ToolbarSpacer(placement: .bottomBar) - - ToolbarItem(placement: .bottomBar) { - Button { model.onTapCreateSpace() } label: { Label("", systemImage: "plus") } - } - .matchedTransitionSource(id: "SpaceCreateTypePickerView", in: namespace) - } - - - @ViewBuilder - private var emptyStateView: some View { - HomeUpdateSubmoduleView().padding(8) - EmptyStateView( - title: Loc.thereAreNoSpacesYet, - subtitle: "", - style: .withImage, - buttonData: EmptyStateView.ButtonData(title: Loc.createSpace) { - model.onTapCreateSpace() - } - ) - } - - @ViewBuilder - private var searchEmptyStateView: some View { - HomeUpdateSubmoduleView().padding(8) - EmptyStateView( - title: Loc.noMatchesFound, - subtitle: "", - style: .withImage, - buttonData: nil - ) - } - - private var attentionDotView: some View { - Circle() - .fill(Color.Pure.red) - .frame(width: 6, height: 6) - .padding([.top, .trailing], 1) - } - - private func spaceCard(_ space: ParticipantSpaceViewDataWithPreview) -> some View { - SpaceCard( - spaceData: space, - wallpaper: model.wallpapers[space.spaceView.targetSpaceId] ?? .default, - draggedSpace: $draggedSpace, - onTap: { - model.onSpaceTap(spaceId: space.spaceView.targetSpaceId) - }, - onTapCopy: { - model.copySpaceInfo(spaceView: space.spaceView) - }, - onTapMute: { - model.muteSpace(spaceView: space.spaceView) - }, - onTapPin: { - try await model.pin(spaceView: space.spaceView) - }, - onTapUnpin: { - try await model.unpin(spaceView: space.spaceView) }, onTapSettings: { - model.openSpaceSettings(spaceId: space.spaceView.targetSpaceId) - }, - onTapDelete: { - model.onDeleteSpace(spaceId: space.spaceView.targetSpaceId) + model.onTapSettings() } ) - .equatable() - .if(FeatureFlags.vaultBackToRoots) { - $0.padding(.horizontal, 16) - } - .if(space.spaceView.isPinned) { - $0.onDrop( - of: [.text], - delegate: SpaceHubDropDelegate( - destinationItem: space, - allSpaces: $model.spaces, - draggedItem: $draggedSpace, - initialIndex: $draggedInitialIndex - ) - ) - } } } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubViewModel.swift index 4dbd89c3fc..4adc5412c4 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/SpaceHubViewModel.swift @@ -6,44 +6,40 @@ import AsyncAlgorithms import Loc @MainActor -final class SpaceHubViewModel: ObservableObject { - @Published var spaces: [ParticipantSpaceViewDataWithPreview]? - @Published var searchText: String = "" +@Observable +final class SpaceHubViewModel { - var filteredSpaces: [ParticipantSpaceViewDataWithPreview] { - guard let spaces else { return [] } - guard !searchText.isEmpty else { return spaces } - - return spaces.filter { space in - space.spaceView.name.localizedCaseInsensitiveContains(searchText) - } - } + var spaces: [ParticipantSpaceViewDataWithPreview]? + var dataLoaded = false + var searchText: String = "" + var filteredSpaces: [SpaceCardModel] = [] - @Published var wallpapers: [String: SpaceWallpaperType] = [:] + var wallpapers: [String: SpaceWallpaperType] = [:] - @Published var notificationsDenied = false - @Published var spaceMuteData: SpaceMuteData? - @Published var showLoading = false - @Published var profileIcon: Icon? - @Published var spaceToDelete: StringIdentifiable? + var notificationsDenied = false + var spaceMuteData: SpaceMuteData? + var profileIcon: Icon? + var spaceToDelete: StringIdentifiable? + @ObservationIgnored private weak var output: (any SpaceHubModuleOutput)? - - @Injected(\.userDefaultsStorage) + @Injected(\.userDefaultsStorage) @ObservationIgnored private var userDefaults: any UserDefaultsStorageProtocol - @Injected(\.spaceViewsStorage) + @Injected(\.spaceViewsStorage) @ObservationIgnored private var workspacesStorage: any SpaceViewsStorageProtocol - @Injected(\.spaceOrderService) + @Injected(\.spaceOrderService) @ObservationIgnored private var spaceOrderService: any SpaceOrderServiceProtocol - @Injected(\.profileStorage) + @Injected(\.profileStorage) @ObservationIgnored private var profileStorage: any ProfileStorageProtocol - @Injected(\.spaceHubSpacesStorage) + @Injected(\.spaceHubSpacesStorage) @ObservationIgnored private var spaceHubSpacesStorage: any SpaceHubSpacesStorageProtocol - @Injected(\.pushNotificationsSystemSettingsBroadcaster) + @Injected(\.pushNotificationsSystemSettingsBroadcaster) @ObservationIgnored private var pushNotificationsSystemSettingsBroadcaster: any PushNotificationsSystemSettingsBroadcasterProtocol - @Injected(\.workspaceService) + @Injected(\.workspaceService) @ObservationIgnored private var workspaceService: any WorkspaceServiceProtocol + @Injected(\.spaceCardModelBuilder) @ObservationIgnored + private var spaceCardModelBuilder: any SpaceCardModelBuilderProtocol init(output: (any SpaceHubModuleOutput)?) { self.output = output @@ -67,11 +63,13 @@ final class SpaceHubViewModel: ObservableObject { } - func copySpaceInfo(spaceView: SpaceView) { + func copySpaceInfo(spaceViewId: String) { + guard let spaceView = spaces?.first(where: { $0.spaceView.id == spaceViewId })?.spaceView else { return } UIPasteboard.general.string = String(describing: spaceView) } - func muteSpace(spaceView: SpaceView) { + func muteSpace(spaceViewId: String) { + guard let spaceView = spaces?.first(where: { $0.spaceView.id == spaceViewId })?.spaceView else { return } let isUnmutedAll = spaceView.pushNotificationMode.isUnmutedAll spaceMuteData = SpaceMuteData( spaceId: spaceView.targetSpaceId, @@ -79,19 +77,19 @@ final class SpaceHubViewModel: ObservableObject { ) } - func pin(spaceView: SpaceView) async throws { + func pin(spaceViewId: String) async throws { guard let spaces else { return } let pinnedSpaces = spaces.filter { $0.spaceView.isPinned } + + var newOrder = pinnedSpaces.filter { $0.spaceView.id != spaceViewId }.map(\.spaceView.id) + newOrder.insert(spaceViewId, at: 0) - var newOrder = pinnedSpaces.filter { $0.spaceView.id != spaceView.id }.map(\.spaceView.id) - newOrder.insert(spaceView.id, at: 0) - - try await spaceOrderService.setOrder(spaceViewIdMoved: spaceView.id, newOrder: newOrder) + try await spaceOrderService.setOrder(spaceViewIdMoved: spaceViewId, newOrder: newOrder) AnytypeAnalytics.instance().logPinSpace() } - func unpin(spaceView: SpaceView) async throws { - try await spaceOrderService.unsetOrder(spaceViewId: spaceView.id) + func unpin(spaceViewId: String) async throws { + try await spaceOrderService.unsetOrder(spaceViewId: spaceViewId) AnytypeAnalytics.instance().logUnpinSpace() } @@ -124,11 +122,18 @@ final class SpaceHubViewModel: ObservableObject { spaceMuteData = nil } + func searchTextUpdated() { + Task { + await updateFilteredSpaces() + } + } + // MARK: - Private private func subscribeOnSpaces() async { for await spaces in await spaceHubSpacesStorage.spacesStream { self.spaces = spaces.sorted(by: sortSpacesForPinnedFeature) - showLoading = spaces.contains { $0.spaceView.isLoading } + await updateFilteredSpaces() + self.dataLoaded = spaces.isNotEmpty } } @@ -141,8 +146,8 @@ final class SpaceHubViewModel: ObservableObject { case (false, true): return false case (false, false): - let lhsMessageDate = lhs.preview.lastMessage?.createdAt - let rhsMessageDate = rhs.preview.lastMessage?.createdAt + let lhsMessageDate = lhs.latestPreview.lastMessage?.createdAt + let rhsMessageDate = rhs.latestPreview.lastMessage?.createdAt let lhsJoinDate = lhs.spaceView.joinDate let rhsJoinDate = rhs.spaceView.joinDate @@ -206,4 +211,22 @@ final class SpaceHubViewModel: ObservableObject { notificationsDenied = status.isDenied } } + + private func updateFilteredSpaces() async { + guard let spaces else { + filteredSpaces = [] + return + } + + let spacesToFilter: [ParticipantSpaceViewDataWithPreview] + if searchText.isEmpty { + spacesToFilter = spaces + } else { + spacesToFilter = spaces.filter { space in + space.spaceView.name.localizedCaseInsensitiveContains(searchText) + } + } + + self.filteredSpaces = await spaceCardModelBuilder.build(from: spacesToFilter, wallpapers: wallpapers) + } } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/NewSpaceCardLabel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/NewSpaceCardLabel.swift deleted file mode 100644 index 8681065564..0000000000 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/NewSpaceCardLabel.swift +++ /dev/null @@ -1,203 +0,0 @@ -import SwiftUI -import AnytypeCore - -// SpaceCardLabel and SpaceCard are splitted for better SwiftUI diff. -struct NewSpaceCardLabel: View { - - let spaceData: ParticipantSpaceViewDataWithPreview - let wallpaper: SpaceWallpaperType - private let dateFormatter = ChatPreviewDateFormatter() - @Binding var draggedSpace: ParticipantSpaceViewDataWithPreview? - - @Namespace private var namespace - - var body: some View { - content - .if(spaceData.spaceView.isPinned) { - $0.onDrag { - draggedSpace = spaceData - return NSItemProvider() - } preview: { - EmptyView() - } - } - } - - private var content: some View { - HStack(alignment: .center, spacing: 12) { - IconView(icon: spaceData.spaceView.objectIconImage) - .frame(width: 56, height: 56) - - Group { - if let message = spaceData.preview.lastMessage { - mainContentWithMessage(message) - } else { - mainContentWithoutMessage - } - } - // Fixing the animation when the cell is moved and updated inside - // Optimization - create a data model for SpaceCard and map to in in SpaceHubViewModel on background thread - .id(spaceData.hashValue) - .matchedGeometryEffect(id: "content", in: namespace, properties: .position, anchor: .topLeading) - } - .padding(.horizontal, 16) - .padding(.vertical, 17) - // Optimization for fast sizeThatFits - .frame(height: 98) - - .cornerRadius(20, style: .continuous) - .background(DashboardWallpaper( - mode: .spaceHub, - wallpaper: wallpaper, - spaceIcon: spaceData.spaceView.objectIconImage - )) - .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous)) - } - - private func mainContentWithMessage(_ message: LastMessagePreview) -> some View { - VStack(alignment: .leading, spacing: 0) { - HStack(alignment: .bottom) { - HStack(alignment: .center) { - AnytypeText(spaceData.spaceView.name.withPlaceholder, style: .bodySemibold) - .lineLimit(1) - .foregroundColor(Color.Text.primary) - if isMuted { - Spacer.fixedWidth(4) - Image(asset: .X18.muted).foregroundColor(.Control.transparentSecondary) - } - } - - Spacer(minLength: 8) - - VStack(spacing: 0) { - lastMessageDate - Spacer.fixedHeight(2) - } - } - - HStack(alignment: .top) { - lastMessagePreview(message) - Spacer() - decoration - } - - Spacer(minLength: 0) - } - } - - private var mainContentWithoutMessage: some View { - VStack(alignment: .leading, spacing: 0) { - HStack { - AnytypeText(spaceData.spaceView.name.withPlaceholder, style: .bodySemibold) - .lineLimit(1) - .foregroundColor(Color.Text.primary) - if isMuted { - Spacer.fixedWidth(8) - Image(asset: .X18.muted).foregroundColor(.Control.transparentSecondary) - } - Spacer() - pin - } - } - } - - @ViewBuilder - func lastMessagePreview(_ message: LastMessagePreview) -> some View { - Group { - if message.attachments.isNotEmpty { - messageWithAttachements(message) - } else if message.text.isNotEmpty { - messageWithoutAttachements(message) - } else { - AnytypeText(message.creator?.title ?? Loc.Chat.newMessages, style: .chatPreviewMedium) - .foregroundColor(.Text.transparentSecondary) - .lineLimit(1) - } - } - .multilineTextAlignment(.leading) - } - - func messageWithoutAttachements(_ message: LastMessagePreview) -> some View { - Group { - if let creator = message.creator { - VStack(alignment: .leading, spacing: 2) { - Text(creator.title).anytypeFontStyle(.chatPreviewMedium) - Text(message.text).anytypeFontStyle(.chatPreviewRegular) - } - .lineLimit(1) - } else { - Text(message.text).anytypeFontStyle(.chatPreviewRegular) - .lineLimit(2) - } - } - .foregroundColor(.Text.transparentSecondary) - .anytypeLineHeightStyle(.chatPreviewRegular) - } - - @ViewBuilder - func messageWithAttachements(_ message: LastMessagePreview) -> some View { - VStack(alignment: .leading, spacing: 2) { - - if let creator = message.creator { - AnytypeText(creator.title, style: .chatPreviewMedium) - .foregroundColor(.Text.transparentSecondary) - .lineLimit(1) - } - - HStack(spacing: 2) { - ForEach(message.attachments.prefix(3)) { - IconView(icon: $0.objectIconImage).frame(width: 18, height: 18) - } - - Spacer.fixedWidth(2) - AnytypeText(message.localizedAttachmentsText, style: .chatPreviewRegular) - .foregroundColor(.Text.transparentSecondary) - .lineLimit(1) - } - } - } - - @ViewBuilder - private var lastMessageDate: some View { - if let lastMessage = spaceData.preview.lastMessage { - AnytypeText(dateFormatter.localizedDateString(for: lastMessage.createdAt, showTodayTime: true), style: .relation2Regular) - .foregroundColor(.Control.transparentSecondary) - } - } - - @ViewBuilder - private var decoration: some View { - if spaceData.preview.hasCounters { - unreadCounters - } else { - pin - } - } - - private var unreadCounters: some View { - HStack(spacing: 4) { - if spaceData.preview.mentionCounter > 0 { - MentionBadge(style: isMuted ? .muted : .highlighted) - } - if spaceData.preview.unreadCounter > 0 { - CounterView( - count: spaceData.preview.unreadCounter, - style: isMuted ? .muted : .highlighted - ) - } - } - } - - @ViewBuilder - private var pin: some View { - if spaceData.spaceView.isPinned { - Image(asset: .X18.pin) - .foregroundColor(Color.Control.transparentSecondary) - .frame(width: 18, height: 18) - } - } - - private var isMuted: Bool { - FeatureFlags.muteSpacePossibility && !spaceData.spaceView.pushNotificationMode.isUnmutedAll - } -} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel+Presentation.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel+Presentation.swift new file mode 100644 index 0000000000..15c0360a83 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel+Presentation.swift @@ -0,0 +1,40 @@ +import SwiftUI + +extension MessagePreviewModel { + + var messagePreviewText: String { + if let authorName = creatorTitle, authorName.isNotEmpty { + return "\(authorName): \(localizedAttachmentsText)" + } + return localizedAttachmentsText + } + + var titleColor: Color { + if !isMuted { + .Text.primary + } else { + .Text.secondary + } + } + + var messagePreviewColor: Color { + guard !isMuted else { return .Text.secondary } + return totalCounter > 0 ? .Text.primary : .Text.secondary + } + + var totalCounter: Int { + unreadCounter + mentionCounter + } + + var mentionStyle: MentionBadgeStyle { + isMuted ? .muted : .highlighted + } + + var unreadStyle: CounterViewStyle { + isMuted ? .muted : .highlighted + } + + var hasCounters: Bool { + totalCounter > 0 + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel.swift new file mode 100644 index 0000000000..e24a4006e1 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/MessagePreviewModel.swift @@ -0,0 +1,20 @@ +import Foundation + +struct MessagePreviewModel: Equatable, Hashable { + let creatorTitle: String? + let text: String + let attachments: [Attachment] + let localizedAttachmentsText: String + let chatPreviewDate: String + let unreadCounter: Int + let mentionCounter: Int + let isMuted: Bool + let chatName: String? +} + +extension MessagePreviewModel { + struct Attachment: Equatable, Hashable, Identifiable { + let id: String + let icon: Icon + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLabel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLabel.swift new file mode 100644 index 0000000000..a042272603 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLabel.swift @@ -0,0 +1,137 @@ +import SwiftUI +import AnytypeCore + +// NewSpaceCardLabel and SpaceCard are splitted for better SwiftUI diff. +struct NewSpaceCardLabel: View { + + let model: SpaceCardModel + @Binding var draggedSpaceViewId: String? + + @Namespace private var namespace + + var body: some View { + content + .onDragIf(model.isPinned) { + draggedSpaceViewId = model.spaceViewId + return NSItemProvider() + } preview: { + EmptyView() + } + } + + private var content: some View { + HStack(alignment: .center, spacing: 12) { + IconView(icon: model.objectIconImage) + .frame(width: 56, height: 56) + + Group { + if let message = model.lastMessage { + mainContentWithMessage(message) + } else { + mainContentWithoutMessage + } + } + .matchedGeometryEffect(id: "content", in: namespace, properties: .position, anchor: .topLeading) + } + .padding(.horizontal, 16) + .padding(.vertical, 17) + // Optimization for fast sizeThatFits + .frame(height: 98) + + .cornerRadius(20, style: .continuous) + .background(DashboardWallpaper( + mode: .spaceHub, + wallpaper: model.wallpaper, + spaceIcon: model.objectIconImage + )) + .background(Color.Background.primary) + .clipShape(RoundedRectangle(cornerRadius: 20, style: .continuous)) + } + + private func mainContentWithMessage(_ message: MessagePreviewModel) -> some View { + VStack(alignment: .leading, spacing: 0) { + HStack(alignment: .bottom) { + HStack(alignment: .center) { + AnytypeText(model.nameWithPlaceholder, style: .bodySemibold) + .lineLimit(1) + .foregroundColor(Color.Text.primary) + if model.isMuted { + Spacer.fixedWidth(4) + Image(asset: .X18.muted).foregroundColor(.Control.transparentSecondary) + } + } + + Spacer(minLength: 8) + + VStack(spacing: 0) { + lastMessageDate + Spacer.fixedHeight(2) + } + } + + HStack(alignment: .top) { + NewSpaceCardLastMessageView(model: message, supportsMultiChats: model.supportsMultiChats) + Spacer() + decoration + } + + Spacer(minLength: 0) + } + } + + private var mainContentWithoutMessage: some View { + VStack(alignment: .leading, spacing: 0) { + HStack { + AnytypeText(model.nameWithPlaceholder, style: .bodySemibold) + .lineLimit(1) + .foregroundColor(Color.Text.primary) + if model.isMuted { + Spacer.fixedWidth(8) + Image(asset: .X18.muted).foregroundColor(.Control.transparentSecondary) + } + Spacer() + pin + } + } + } + + @ViewBuilder + private var lastMessageDate: some View { + if let lastMessage = model.lastMessage { + AnytypeText(lastMessage.chatPreviewDate, style: .relation2Regular) + .foregroundColor(.Control.transparentSecondary) + } + } + + @ViewBuilder + private var decoration: some View { + if model.hasCounters { + unreadCounters + } else { + pin + } + } + + private var unreadCounters: some View { + HStack(spacing: 4) { + if model.mentionCounter > 0 { + MentionBadge(style: model.isMuted ? .muted : .highlighted) + } + if model.unreadCounter > 0 { + CounterView( + count: model.unreadCounter, + style: model.isMuted ? .muted : .highlighted + ) + } + } + } + + @ViewBuilder + private var pin: some View { + if model.isPinned { + Image(asset: .X18.pin) + .foregroundColor(Color.Control.transparentSecondary) + .frame(width: 18, height: 18) + } + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLastMessageView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLastMessageView.swift new file mode 100644 index 0000000000..916350e0ac --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/NewSpaceCardLastMessageView.swift @@ -0,0 +1,91 @@ +import SwiftUI +import Services + +struct NewSpaceCardLastMessageView: View { + + let model: MessagePreviewModel + let supportsMultiChats: Bool + + var body: some View { + Group { + if model.attachments.isNotEmpty { + messageWithAttachements + } else if model.text.isNotEmpty { + messageWithoutAttachements + } else { + AnytypeText(model.creatorTitle ?? Loc.Chat.newMessages, style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + } + .multilineTextAlignment(.leading) + } + + private var messageWithoutAttachements: some View { + Group { + if supportsMultiChats, let chatName = model.chatName { + multiChatMessageView(chatName: chatName, messageText: model.text, creatorTitle: model.creatorTitle) + } else if let creatorTitle = model.creatorTitle { + AnytypeText("\(creatorTitle): \(model.text)", style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(2) + } else { + AnytypeText(model.text, style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(2) + } + } + .anytypeLineHeightStyle(.chatPreviewRegular) + } + + private func multiChatMessageView(chatName: String, messageText: String, creatorTitle: String?) -> some View { + VStack(alignment: .leading, spacing: 2) { + AnytypeText(chatName, style: .chatPreviewMedium) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + if let creatorTitle { + AnytypeText("\(creatorTitle): \(messageText)", style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } else { + AnytypeText(messageText, style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + } + } + + private var messageWithAttachements: some View { + VStack(alignment: .leading, spacing: 2) { + if supportsMultiChats { + if let chatName = model.chatName { + AnytypeText(chatName, style: .chatPreviewMedium) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + } else if let creatorTitle = model.creatorTitle { + AnytypeText(creatorTitle, style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + + HStack(spacing: 2) { + if supportsMultiChats, let creatorTitle = model.creatorTitle { + AnytypeText("\(creatorTitle):", style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + Spacer.fixedWidth(2) + + ForEach(model.attachments) { + IconView(icon: $0.icon).frame(width: 18, height: 18) + } + + Spacer.fixedWidth(2) + AnytypeText(model.localizedAttachmentsText, style: .chatPreviewRegular) + .foregroundColor(.Text.transparentSecondary) + .lineLimit(1) + } + } + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCard.swift similarity index 63% rename from Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard.swift rename to Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCard.swift index 2e9c91c5fe..7d6ca4ffc2 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCard.swift @@ -1,11 +1,10 @@ import SwiftUI import AnytypeCore -struct SpaceCard: View, @preconcurrency Equatable { - - let spaceData: ParticipantSpaceViewDataWithPreview - let wallpaper: SpaceWallpaperType - @Binding var draggedSpace: ParticipantSpaceViewDataWithPreview? +struct SpaceCard: View { + + let model: SpaceCardModel + @Binding var draggedSpaceViewId: String? let onTap: () -> Void let onTapCopy: () -> Void let onTapMute: () -> Void @@ -13,24 +12,15 @@ struct SpaceCard: View, @preconcurrency Equatable { let onTapUnpin: () async throws -> Void let onTapSettings: () -> Void let onTapDelete: () -> Void - + var body: some View { Button { onTap() } label: { - if !FeatureFlags.vaultBackToRoots { - SpaceCardLabel( - spaceData: spaceData, - wallpaper: wallpaper, - draggedSpace: $draggedSpace - ) - } else { - NewSpaceCardLabel( - spaceData: spaceData, - wallpaper: wallpaper, - draggedSpace: $draggedSpace - ) - } + NewSpaceCardLabel( + model: model, + draggedSpaceViewId: $draggedSpaceViewId + ) } .contentShape([.dragPreview, .contextMenuPreview], RoundedRectangle(cornerRadius: 20, style: .continuous)) .contextMenu { menuItems.tint(Color.Text.primary) } @@ -38,22 +28,22 @@ struct SpaceCard: View, @preconcurrency Equatable { @ViewBuilder private var menuItems: some View { - if spaceData.spaceView.isLoading { + if model.isLoading { copyButton Divider() } - if spaceData.spaceView.isPinned { + if model.isPinned { unpinButton } else { pinButton } - - if FeatureFlags.muteSpacePossibility, spaceData.spaceView.isShared { + + if model.isShared { muteButton } - if spaceData.spaceView.isLoading { + if model.isLoading { deleteButton } else { settingsButton @@ -73,9 +63,9 @@ struct SpaceCard: View, @preconcurrency Equatable { onTapMute() } label: { HStack { - Text(spaceData.spaceView.pushNotificationMode.isUnmutedAll ? Loc.mute : Loc.unmute) + Text(!model.isMuted ? Loc.mute : Loc.unmute) Spacer() - Image(systemName: spaceData.spaceView.pushNotificationMode.isUnmutedAll ? "bell.slash" : "bell") + Image(systemName: !model.isMuted ? "bell.slash" : "bell") } } } @@ -122,10 +112,4 @@ struct SpaceCard: View, @preconcurrency Equatable { .tint(.red) } } - - static func == (lhs: Self, rhs: Self) -> Bool { - lhs.spaceData == rhs.spaceData - && lhs.wallpaper == rhs.wallpaper - && lhs.draggedSpace == rhs.draggedSpace - } } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardLastMessageView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardLastMessageView.swift new file mode 100644 index 0000000000..4f99215aa6 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardLastMessageView.swift @@ -0,0 +1,47 @@ +import SwiftUI + +struct SpaceCardLastMessageView: View { + + let model: MessagePreviewModel + + var body: some View { + if model.text.isNotEmpty { + // Do not show attachements due to SwiftUI limitations: + // Can not fit attachements in between two lines of text with proper multiline behaviour + messageWithoutAttachements + } else if model.attachments.isNotEmpty { + // Show attachements and 1 line of text + messageWithAttachements + } else { + Text(model.creatorTitle ?? Loc.Chat.newMessages) + .anytypeStyle(.uxTitle2Medium).lineLimit(1) + } + } + + private var messageWithoutAttachements: some View { + Group { + if let creatorTitle = model.creatorTitle { + Text(creatorTitle + ": ").anytypeFontStyle(.uxTitle2Medium) + + Text(model.text).anytypeFontStyle(.uxTitle2Regular) + } else { + Text(model.text).anytypeFontStyle(.uxTitle2Regular) + } + }.lineLimit(2).anytypeLineHeightStyle(.uxTitle2Regular) + } + + private var messageWithAttachements: some View { + HStack(spacing: 2) { + if let creatorTitle = model.creatorTitle { + Text(creatorTitle + ":").anytypeStyle(.uxTitle2Medium).lineLimit(1) + Spacer.fixedWidth(4) + } + + ForEach(model.attachments) { + IconView(icon: $0.icon).frame(width: 18, height: 18) + } + + Spacer.fixedWidth(4) + Text(model.localizedAttachmentsText).anytypeStyle(.uxTitle2Regular).lineLimit(1) + } + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModel.swift new file mode 100644 index 0000000000..5c41ca1400 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModel.swift @@ -0,0 +1,24 @@ +import Services +import AnytypeCore + +struct SpaceCardModel: Equatable, Identifiable { + let spaceViewId: String + let targetSpaceId: String + let objectIconImage: Icon + let nameWithPlaceholder: String + let isPinned: Bool + let isLoading: Bool + let isShared: Bool + let isMuted: Bool + let uxTypeName: String + let supportsMultiChats: Bool + + let lastMessage: MessagePreviewModel? + let unreadCounter: Int + let mentionCounter: Int + let hasCounters: Bool + + let wallpaper: SpaceWallpaperType + + var id: String { spaceViewId } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModelBuilder.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModelBuilder.swift new file mode 100644 index 0000000000..45342157f4 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCard/SpaceCardModelBuilder.swift @@ -0,0 +1,89 @@ +import Services +import AnytypeCore +import Factory + +protocol SpaceCardModelBuilderProtocol: AnyObject, Sendable { + func build( + from spaces: [ParticipantSpaceViewDataWithPreview], + wallpapers: [String: SpaceWallpaperType] + ) async -> [SpaceCardModel] +} + +final class SpaceCardModelBuilder: SpaceCardModelBuilderProtocol, Sendable { + + private let chatPreviewDateFormatter = ChatPreviewDateFormatter() + @Injected(\.chatDetailsStorage) + private var chatDetailsStorage: any ChatDetailsStorageProtocol + + func build( + from spaces: [ParticipantSpaceViewDataWithPreview], + wallpapers: [String: SpaceWallpaperType] + ) async -> [SpaceCardModel] { + await Task.detached { + var models = [SpaceCardModel]() + for space in spaces { + models.append(await self.buildModel(from: space, wallpapers: wallpapers)) + } + return models + }.value + } + + private func buildModel( + from spaceData: ParticipantSpaceViewDataWithPreview, + wallpapers: [String: SpaceWallpaperType] + ) async -> SpaceCardModel { + let spaceView = spaceData.spaceView + let latestPreview = spaceData.latestPreview + + let lastMessage: MessagePreviewModel? + if let lastMessagePreview = latestPreview.lastMessage { + let attachments = lastMessagePreview.attachments.prefix(3).map { objectDetails in + MessagePreviewModel.Attachment( + id: objectDetails.id, + icon: objectDetails.objectIconImage + ) + } + + let chatId = latestPreview.chatId + let chatName = await chatDetailsStorage.chat(id: chatId)?.name + + lastMessage = MessagePreviewModel( + creatorTitle: lastMessagePreview.creator?.title, + text: lastMessagePreview.text, + attachments: Array(attachments), + localizedAttachmentsText: lastMessagePreview.localizedAttachmentsText, + chatPreviewDate: chatPreviewDateFormatter.localizedDateString(for: lastMessagePreview.createdAt, showTodayTime: true), + unreadCounter: 0, // unsupported in space hub + mentionCounter: 0, // unsupported in space hub + isMuted: false, // unsupported in space hub + chatName: chatName + ) + } else { + lastMessage = nil + } + + return SpaceCardModel( + spaceViewId: spaceView.id, + targetSpaceId: spaceView.targetSpaceId, + objectIconImage: spaceView.objectIconImage, + nameWithPlaceholder: spaceView.name.withPlaceholder, + isPinned: spaceView.isPinned, + isLoading: spaceView.isLoading, + isShared: spaceView.isShared, + isMuted: !spaceView.pushNotificationMode.isUnmutedAll, + uxTypeName: spaceView.uxType.name, + supportsMultiChats: spaceView.uxType.supportsMultiChats, + lastMessage: lastMessage, + unreadCounter: spaceData.totalUnreadCounter, + mentionCounter: spaceData.totalMentionCounter, + hasCounters: spaceData.hasCounters, + wallpaper: wallpapers[spaceView.targetSpaceId] ?? .default + ) + } +} + +extension Container { + var spaceCardModelBuilder: Factory< any SpaceCardModelBuilderProtocol> { + self { SpaceCardModelBuilder() }.shared + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCardLabel.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCardLabel.swift deleted file mode 100644 index fa0f4c83a0..0000000000 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceCardLabel.swift +++ /dev/null @@ -1,155 +0,0 @@ -import SwiftUI -import AnytypeCore - -// SpaceCardLabel and SpaceCard are splitted for better SwiftUI diff. -struct SpaceCardLabel: View { - - let spaceData: ParticipantSpaceViewDataWithPreview - let wallpaper: SpaceWallpaperType - private let dateFormatter = HistoryDateFormatter() - @Binding var draggedSpace: ParticipantSpaceViewDataWithPreview? - - @Namespace private var namespace - - var body: some View { - HStack(alignment: .center, spacing: 12) { - IconView(icon: spaceData.spaceView.objectIconImage) - .frame(width: 56, height: 56) - VStack(alignment: .leading, spacing: 0) { - HStack { - Text(spaceData.spaceView.name.withPlaceholder) - .anytypeFontStyle(.bodySemibold) - .lineLimit(1) - .foregroundStyle(Color.Text.primary) - if isMuted { - Spacer.fixedWidth(8) - Image(asset: .X18.muted).foregroundColor(.Control.secondary) - } - Spacer(minLength: 8) - createdDate - } - HStack { - info - Spacer() - unreadCounters - pin - } - Spacer(minLength: 1) - } - // Fixing the animation when the cell is moved and updated inside - // Optimization - create a data model for SpaceCard and map to in in SpaceHubViewModel on background thread - .id(spaceData.hashValue) - .matchedGeometryEffect(id: "content", in: namespace, properties: .position, anchor: .topLeading) - } - .padding(.horizontal, 16) - .padding(.vertical, 8) - // Optimization for fast sizeThatFits - .frame(height: 80) - .background(Color.Background.primary) - .contentShape([.dragPreview, .contextMenuPreview], RoundedRectangle(cornerRadius: 20, style: .continuous)) - - .if(spaceData.spaceView.isPinned) { - $0.onDrag { - draggedSpace = spaceData - return NSItemProvider() - } preview: { - EmptyView() - } - } - } - - private var info: some View { - Group { - if let lastMessage = spaceData.preview.lastMessage { - lastMessagePreview(lastMessage) - } else { - Text(spaceData.spaceView.uxType.name) - .anytypeStyle(.uxTitle2Regular) - .lineLimit(1) - } - } - .foregroundStyle(Color.Text.secondary) - .multilineTextAlignment(.leading) - } - - @ViewBuilder - func lastMessagePreview(_ message: LastMessagePreview) -> some View { - Group { - if message.text.isNotEmpty { - // Do not show attachements due to SwiftUI limitations: - // Can not fit attachements in between two lines of text with proper multiline behaviour - messageWithoutAttachements(message) - } else if message.attachments.isNotEmpty { - // Show attachements and 1 line of text - messageWithAttachements(message) - } else { - Text(message.creator?.title ?? Loc.Chat.newMessages) - .anytypeStyle(.uxTitle2Medium).lineLimit(1) - } - } - } - - func messageWithoutAttachements(_ message: LastMessagePreview) -> some View { - Group { - if let creator = message.creator { - Text(creator.title + ": ").anytypeFontStyle(.uxTitle2Medium) + - Text(message.text).anytypeFontStyle(.uxTitle2Regular) - } else { - Text(message.text).anytypeFontStyle(.uxTitle2Regular) - } - }.lineLimit(2).anytypeLineHeightStyle(.uxTitle2Regular) - } - - @ViewBuilder - func messageWithAttachements(_ message: LastMessagePreview) -> some View { - HStack(spacing: 2) { - if let creator = message.creator { - Text(creator.title + ":").anytypeStyle(.uxTitle2Medium).lineLimit(1) - Spacer.fixedWidth(4) - } - - ForEach(message.attachments.prefix(3)) { - IconView(icon: $0.objectIconImage).frame(width: 18, height: 18) - } - - Spacer.fixedWidth(4) - Text(message.localizedAttachmentsText).anytypeStyle(.uxTitle2Regular).lineLimit(1) - } - } - - @ViewBuilder - private var createdDate: some View { - if let lastMessage = spaceData.preview.lastMessage { - Text(dateFormatter.localizedDateString(for: lastMessage.createdAt, showTodayTime: true)) - .anytypeStyle(.relation2Regular) - .foregroundStyle(Color.Control.transparentSecondary) - } - } - - private var unreadCounters: some View { - HStack(spacing: 4) { - if spaceData.preview.mentionCounter > 0 { - MentionBadge(style: isMuted ? .muted : .highlighted) - } - if spaceData.preview.unreadCounter > 0 { - CounterView( - count: spaceData.preview.unreadCounter, - style: isMuted ? .muted : .highlighted - ) - } - } - } - - @ViewBuilder - private var pin: some View { - if !spaceData.preview.hasCounters && spaceData.spaceView.isPinned { - Image(asset: .X18.pin) - .foregroundStyle(Color.Control.secondary) - .frame(width: 18, height: 18) - } - } - - private var isMuted: Bool { - FeatureFlags.muteSpacePossibility && !spaceData.spaceView.pushNotificationMode.isUnmutedAll - } -} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubAttentionDotView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubAttentionDotView.swift new file mode 100644 index 0000000000..8bd2f6fcee --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubAttentionDotView.swift @@ -0,0 +1,10 @@ +import SwiftUI + +struct SpaceHubAttentionDotView: View { + + var body: some View { + Circle() + .fill(Color.Pure.red) + .frame(width: 6, height: 6) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubEmptyStateView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubEmptyStateView.swift new file mode 100644 index 0000000000..98a92cbf5a --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubEmptyStateView.swift @@ -0,0 +1,18 @@ +import SwiftUI + +struct SpaceHubEmptyStateView: View { + + let onTapCreateSpace: () -> Void + + var body: some View { + HomeUpdateSubmoduleView().padding(8) + EmptyStateView( + title: Loc.thereAreNoSpacesYet, + subtitle: "", + style: .withImage, + buttonData: EmptyStateView.ButtonData(title: Loc.createSpace) { + onTapCreateSpace() + } + ) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubList.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubList.swift new file mode 100644 index 0000000000..b29707924b --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubList.swift @@ -0,0 +1,83 @@ +import SwiftUI +import AnytypeCore + +// Is part of main view SpaceHubView. Related from SpaceHubViewModel +struct SpaceHubList: View { + + @Bindable var model: SpaceHubViewModel + + @State private var draggedSpaceViewId: String? + @State private var draggedInitialIndex: Int? + + var body: some View { + if model.filteredSpaces.isEmpty && model.searchText.isEmpty { + emptyStateView + } else if model.filteredSpaces.isNotEmpty { + scrollView + } else { + SpaceHubSearchEmptySpaceView() + } + } + + private var scrollView: some View { + ScrollView { + VStack(spacing: 8) { + HomeUpdateSubmoduleView().padding(8) + + ForEach(model.filteredSpaces) { + spaceCard($0) + } + + Spacer.fixedHeight(40) + } + } + .animation(.default, value: model.filteredSpaces) + } + + private var emptyStateView: some View { + SpaceHubEmptyStateView { + model.onTapCreateSpace() + } + } + + @ViewBuilder + private func spaceCard(_ cardModel: SpaceCardModel) -> some View { + SpaceCard( + model: cardModel, + draggedSpaceViewId: $draggedSpaceViewId, + onTap: { + model.onSpaceTap(spaceId: cardModel.targetSpaceId) + }, + onTapCopy: { + model.copySpaceInfo(spaceViewId: cardModel.spaceViewId) + }, + onTapMute: { + model.muteSpace(spaceViewId: cardModel.spaceViewId) + }, + onTapPin: { + try await model.pin(spaceViewId: cardModel.spaceViewId) + }, + onTapUnpin: { + try await model.unpin(spaceViewId: cardModel.spaceViewId) + }, + onTapSettings: { + model.openSpaceSettings(spaceId: cardModel.targetSpaceId) + }, + onTapDelete: { + model.onDeleteSpace(spaceId: cardModel.targetSpaceId) + } + ) + .padding(.horizontal, 16) + .onDropIf( + cardModel.isPinned, + of: [.text], + delegate: SpaceHubDropDelegate( + destinationSpaceViewId: cardModel.spaceViewId, + allSpaces: $model.spaces, + draggedSpaceViewId: $draggedSpaceViewId, + initialIndex: $draggedInitialIndex + ) + ) + .id(cardModel.id) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubSearchEmptySpaceView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubSearchEmptySpaceView.swift new file mode 100644 index 0000000000..ed9755aaf3 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubSearchEmptySpaceView.swift @@ -0,0 +1,14 @@ +import SwiftUI + +struct SpaceHubSearchEmptySpaceView: View { + + var body: some View { + HomeUpdateSubmoduleView().padding(8) + EmptyStateView( + title: Loc.noMatchesFound, + subtitle: "", + style: .withImage, + buttonData: nil + ) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubToolbar.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubToolbar.swift new file mode 100644 index 0000000000..4c3955fc98 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceHub/Subviews/SpaceHubToolbar.swift @@ -0,0 +1,79 @@ +import SwiftUI + +struct SpaceHubToolbar: ToolbarContent { + + let profileIcon: Icon? + let notificationsDenied: Bool + let namespace: Namespace.ID + + let onTapCreateSpace: () -> Void + let onTapSettings: () -> Void + + var body: some ToolbarContent { + if #available(iOS 26.0, *) { + ios26ToolbarItems + } else { + legacyToolbarItems + } + } + + @ToolbarContentBuilder + private var legacyToolbarItems: some ToolbarContent { + ToolbarItem(placement: .topBarLeading) { + Button { + onTapSettings() + } label: { + IconView(icon: profileIcon) + .foregroundStyle(Color.Control.secondary) + .frame(width: 28, height: 28) + .overlay(alignment: .topTrailing) { + if notificationsDenied { + attentionDotView + } + } + .padding(.vertical, 8) + } + } + + ToolbarItem(placement: .topBarTrailing) { + SpaceHubNewSpaceButton { + onTapCreateSpace() + } + } + } + + @available(iOS 26.0, *) + @ToolbarContentBuilder + private var ios26ToolbarItems: some ToolbarContent { + ToolbarItem(placement: .topBarTrailing) { + Button { + onTapSettings() + } label: { + IconView(icon: profileIcon) + .foregroundStyle(Color.Control.secondary) + .frame(width: 44, height: 44) + .overlay(alignment: .topTrailing) { + if notificationsDenied { + attentionDotView + } + } + .padding(.vertical, 8) + } + } + .sharedBackgroundVisibility(.hidden) + + DefaultToolbarItem(kind: .search, placement: .bottomBar) + + ToolbarSpacer(placement: .bottomBar) + + ToolbarItem(placement: .bottomBar) { + Button { onTapCreateSpace() } label: { Label("", systemImage: "plus") } + } + .matchedTransitionSource(id: "SpaceCreateTypePickerView", in: namespace) + } + + private var attentionDotView: some View { + SpaceHubAttentionDotView() + .padding([.top, .trailing], 1) + } +} diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Subviews/SpaceLimitBannerView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Subviews/SpaceLimitBannerView.swift index b668878bd0..eed39294f3 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Subviews/SpaceLimitBannerView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Subviews/SpaceLimitBannerView.swift @@ -69,13 +69,13 @@ struct SpaceLimitBannerView: View { private var buttonsView: some View { HStack(spacing: 8) { if limitType.showManageButton { - StandardButton(Loc.SpaceShare.manageSpaces, style: .secondaryMedium) { + StandardButton(Loc.SpaceShare.manageSpaces, style: .secondaryXSmallStretched) { onManageSpaces?() } } StandardButton( "\(MembershipConstants.membershipSymbol.rawValue) \(Loc.upgrade)", - style: limitType.showManageButton ? .primaryMedium : .primaryLarge + style: .primaryXSmallStretchedBlack ) { onUpgrade() } diff --git a/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Views/NewInviteLinkView.swift b/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Views/NewInviteLinkView.swift index 21dd62460b..f0cce35236 100644 --- a/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Views/NewInviteLinkView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/SpaceShare/Views/NewInviteLinkView.swift @@ -64,7 +64,7 @@ struct NewInviteLinkView: View { linkStateButton linkView Spacer.fixedHeight(8) - StandardButton(Loc.copyLink, style: .primaryLarge) { + StandardButton(Loc.copyLink, style: .primaryMedium) { model.onCopyLink(route: .button) } } diff --git a/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/Subviews/WidgetObjectListCommonRowView.swift b/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/Subviews/WidgetObjectListCommonRowView.swift index a6f10bdaac..3f47e307a6 100644 --- a/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/Subviews/WidgetObjectListCommonRowView.swift +++ b/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/Subviews/WidgetObjectListCommonRowView.swift @@ -8,10 +8,12 @@ struct WidgetObjectListCommonRowView: View { let subtitle: String? var body: some View { - HStack(spacing: 12) { + HStack(spacing: 0) { IconView(icon: icon) .frame(width: 48, height: 48) + Spacer.fixedWidth(12) + VStack(alignment: .leading, spacing: 0) { AnytypeText(title, style: .previewTitle2Medium) .foregroundColor(.Text.primary) diff --git a/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/WidgetObjectListViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/WidgetObjectListViewModel.swift index d01189ca8b..46b3e79979 100644 --- a/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/WidgetObjectListViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/WidgetObjectList/Common/WidgetObjectListViewModel.swift @@ -86,7 +86,7 @@ final class WidgetObjectListViewModel: ObservableObject, OptionsItemProvider, Wi } func startParticipantTask() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: spaceId).values { + for await participant in accountParticipantStorage.participantSequence(spaceId: spaceId) { self.participant = participant canEdit = participant.canEdit editMode = canEdit ? internalModel.editMode : .normal(allowDnd: false) diff --git a/Anytype/Sources/PresentationLayer/Modules/WidgetType/Change/WidgetTypeChangeViewModel.swift b/Anytype/Sources/PresentationLayer/Modules/WidgetType/Change/WidgetTypeChangeViewModel.swift index 561d2f10f5..8861a8005c 100644 --- a/Anytype/Sources/PresentationLayer/Modules/WidgetType/Change/WidgetTypeChangeViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Modules/WidgetType/Change/WidgetTypeChangeViewModel.swift @@ -44,21 +44,20 @@ final class WidgetTypeChangeViewModel: ObservableObject { } private func onTap(layout: BlockWidget.Layout, source: WidgetSource) { - + AnytypeAnalytics.instance().logChangeWidgetLayout( source: source.analyticsSource, layout: layout, route: .inner, context: data.context ) - + Task { @MainActor in try? await blockWidgetService.setLayout( contextId: data.widgetObjectId, widgetBlockId: data.widgetId, layout: layout ) - data.onFinish() } } } diff --git a/Anytype/Sources/PresentationLayer/Notifications/HangedObjectsMonitor.swift b/Anytype/Sources/PresentationLayer/Notifications/HangedObjectsMonitor.swift new file mode 100644 index 0000000000..b01b60654d --- /dev/null +++ b/Anytype/Sources/PresentationLayer/Notifications/HangedObjectsMonitor.swift @@ -0,0 +1,60 @@ +import Foundation + +@MainActor +final class HangedObjectsMonitor { + + private(set) var objectsCount: Int = 0 + private var startTime: Date? + private var timer: Task? + private var shouldShowState: Bool = false + + var onStateChanged: (() -> Void)? + + func update(count: Int) { + objectsCount = count + + if count > 0 { + if startTime == nil { + startTime = Date() + startTimer() + } + } else { + reset() + } + } + + func reset() { + startTime = nil + timer?.cancel() + timer = nil + if shouldShowState { + shouldShowState = false + onStateChanged?() + } + } + + func shouldShow() -> Bool { + shouldShowState + } + + private func startTimer() { + timer?.cancel() + timer = Task { [weak self] in + while !Task.isCancelled { + guard let self, let startTime = self.startTime else { + return + } + + let elapsed = Date().timeIntervalSince(startTime) + let shouldShow = elapsed > 60 + + if self.shouldShowState != shouldShow { + self.shouldShowState = shouldShow + self.onStateChanged?() + } + + try? await Task.sleep(nanoseconds: 1_000_000_000) + } + } + } +} diff --git a/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorView.swift b/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorView.swift index c05ce27d96..559554cc24 100644 --- a/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorView.swift +++ b/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorView.swift @@ -2,16 +2,22 @@ import Foundation import SwiftUI struct NotificationCoordinatorView: View { - - @StateObject private var model: NotificationCoordinatorViewModel + + @StateObject private var model = NotificationCoordinatorViewModel() @Environment(\.dismissAllPresented) private var dismissAllPresented - - init() { - self._model = StateObject(wrappedValue: NotificationCoordinatorViewModel()) - } - + var body: some View { - Color.Background.primary + Color.clear + .allowsHitTesting(false) + .overlay(alignment: .top) { + if let text = model.uploadStatusText { + UploadStatusBannerView(text: text) + .padding(.top, 8) + .transition(.move(edge: .top).combined(with: .opacity)) + .allowsHitTesting(true) + } + } + .animation(.spring(), value: model.uploadStatusText) .onAppear { model.onAppear() model.setDismissAllPresented(dismissAllPresented: dismissAllPresented) @@ -19,6 +25,12 @@ struct NotificationCoordinatorView: View { .onDisappear { model.onDisappear() } + .taskWithMemoryScope { + await model.startHandleSyncStatus() + } + .taskWithMemoryScope { + await model.startHandleSpaceLoading() + } .anytypeSheet(item: $model.spaceRequestAlert) { SpaceRequestAlert(data: $0) { reason in model.onMembershipUpgrateTap(reason: reason) diff --git a/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorViewModel.swift index 703db500d4..9d12e95fd8 100644 --- a/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/Notifications/NotificationCoordinatorViewModel.swift @@ -12,17 +12,26 @@ final class NotificationCoordinatorViewModel: ObservableObject { private var notificationSubscriptionService: any NotificationsSubscriptionServiceProtocol @Injected(\.objectIconBuilder) private var objectIconBuilder: any ObjectIconBuilderProtocol - + @Injected(\.syncStatusStorage) + private var syncStatusStorage: any SyncStatusStorageProtocol + @Injected(\.spaceHubSpacesStorage) + private var spaceHubSpacesStorage: any SpaceHubSpacesStorageProtocol + private var subscription: AnyCancellable? private var dismissAllPresented: DismissAllPresented? - + private var uploadingFilesCount: Int = 0 + private var showSpaceLoading: Bool = false + private let hangedObjectsMonitor = HangedObjectsMonitor() + @Published var spaceRequestAlert: SpaceRequestAlertData? @Published var membershipUpgradeReason: MembershipUpgradeReason? - - init() { - } - + @Published var uploadStatusText: String? + func onAppear() { + hangedObjectsMonitor.onStateChanged = { [weak self] in + self?.updateUploadStatusText() + } + Task { if subscription.isNotNil { anytypeAssertionFailure("Try start subscription again") @@ -37,6 +46,7 @@ final class NotificationCoordinatorViewModel: ObservableObject { func onDisappear() { subscription?.cancel() subscription = nil + hangedObjectsMonitor.reset() } func setDismissAllPresented(dismissAllPresented: DismissAllPresented) { @@ -46,9 +56,51 @@ final class NotificationCoordinatorViewModel: ObservableObject { func onMembershipUpgrateTap(reason: MembershipUpgradeReason) { membershipUpgradeReason = reason } - + + func startHandleSyncStatus() async { + for await statuses in syncStatusStorage.allSpacesStatusPublisher().values { + guard FeatureFlags.showUploadStatusIndicator else { continue } + + uploadingFilesCount = statuses + .filter { $0.status == .syncing } + .reduce(0) { $0 + Int($1.uploadingFilesCounter) } + + if FeatureFlags.showHangedObjects { + let syncingCount = statuses + .filter { $0.status == .syncing } + .reduce(0) { $0 + Int($1.syncingObjectsCounter) } + hangedObjectsMonitor.update(count: syncingCount) + } + + updateUploadStatusText() + } + } + + func startHandleSpaceLoading() async { + for await spaces in await spaceHubSpacesStorage.spacesStream { + showSpaceLoading = spaces.contains { $0.spaceView.isLoading } || FeatureFlags.spaceHubAlwaysShowLoading + updateUploadStatusText() + } + } + // MARK: - Private - + + private func updateUploadStatusText() { + let newText: String? = if uploadingFilesCount > 0 { + Loc.filesUploading(uploadingFilesCount) + } else if showSpaceLoading { + Loc.syncing + } else if hangedObjectsMonitor.shouldShow() { + Loc.itemsSyncing(hangedObjectsMonitor.objectsCount) + } else { + nil + } + + withAnimation { + uploadStatusText = newText + } + } + private func handle(events: [NotificationEvent]) async { for event in events { switch event { diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/SetObjectCreationSettingsCoordinator.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/SetObjectCreationSettingsCoordinator.swift index eeb9a26800..a33f8806d7 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/SetObjectCreationSettingsCoordinator.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/SetObjectCreationSettingsCoordinator.swift @@ -8,7 +8,7 @@ protocol SetObjectCreationSettingsCoordinatorProtocol: AnyObject, SetObjectCreat func showTemplateEditing( setting: ObjectCreationSetting, onTemplateSelection: (() -> Void)?, - onSetAsDefaultTempalte: @escaping (String) -> Void, + onSetAsDefaultTemplate: @escaping (String) -> Void, completion: (() -> Void)? ) } @@ -32,7 +32,7 @@ final class SetObjectCreationSettingsCoordinator: func showTemplateEditing( setting: ObjectCreationSetting, onTemplateSelection: (() -> Void)?, - onSetAsDefaultTempalte: @escaping (String) -> Void, + onSetAsDefaultTemplate: @escaping (String) -> Void, completion: (() -> Void)? ) { let editorView = EditorPageCoordinatorView( @@ -47,10 +47,13 @@ final class SetObjectCreationSettingsCoordinator: } ) - self.useAsTemplateAction = onSetAsDefaultTempalte + self.useAsTemplateAction = onSetAsDefaultTemplate let editingTemplateViewController = TemplateEditingViewController( editorViewController: UIHostingController(rootView: editorView), + objectId: setting.templateId, + spaceId: setting.spaceId, + output: self, onSettingsTap: { [weak self] in guard let self = self else { return } editorModuleInput?.showSettings(output: self) @@ -112,20 +115,20 @@ final class SetObjectCreationSettingsCoordinator: func templateEditingHandler( setting: ObjectCreationSetting, - onSetAsDefaultTempalte: @escaping (String) -> Void, + onSetAsDefaultTemplate: @escaping (String) -> Void, onTemplateSelection: ((ObjectCreationSetting) -> Void)? ) { showTemplateEditing( setting: setting, onTemplateSelection: { [weak self] in self?.navigationContext.dismissAllPresented(animated: true) { - onSetAsDefaultTempalte(setting.templateId) + onSetAsDefaultTemplate(setting.templateId) onTemplateSelection?(setting) } }, - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.navigationContext.dismissTopPresented(animated: true, completion: { - onSetAsDefaultTempalte(templateId) + onSetAsDefaultTemplate(templateId) }) }, completion: nil diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/TemplatesCoordinator.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/TemplatesCoordinator.swift index 153a747740..7001d5cf8c 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/TemplatesCoordinator.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/TemplatesCoordinator.swift @@ -8,13 +8,13 @@ protocol TemplatesCoordinatorProtocol { @MainActor func showTemplatesPicker( document: some BaseDocumentProtocol, - onSetAsDefaultTempalte: @escaping (String) -> Void + onSetAsDefaultTemplate: @escaping (String) -> Void ) @MainActor func showTemplatesPicker( data: TemplatePickerViewModelData, - onSetAsDefaultTempalte: @escaping (String) -> Void + onSetAsDefaultTemplate: @escaping (String) -> Void ) } @@ -26,14 +26,14 @@ final class TemplatesCoordinator: TemplatesCoordinatorProtocol, ObjectSettingsCo private var toastPresenter: any ToastPresenterProtocol private var editorModuleInputs = [String: any EditorPageModuleInput]() - private var onSetAsDefaultTempalte: ((String) -> Void)? + private var onSetAsDefaultTemplate: ((String) -> Void)? nonisolated init() {} @MainActor func showTemplatesPicker( document: some BaseDocumentProtocol, - onSetAsDefaultTempalte: @escaping (String) -> Void + onSetAsDefaultTemplate: @escaping (String) -> Void ) { let data = TemplatePickerViewModelData( mode: .objectTemplate(objectId: document.objectId), @@ -41,15 +41,15 @@ final class TemplatesCoordinator: TemplatesCoordinatorProtocol, ObjectSettingsCo spaceId: document.spaceId, defaultTemplateId: nil ) - showTemplatesPicker(data: data, onSetAsDefaultTempalte: onSetAsDefaultTempalte) + showTemplatesPicker(data: data, onSetAsDefaultTemplate: onSetAsDefaultTemplate) } @MainActor func showTemplatesPicker( data: TemplatePickerViewModelData, - onSetAsDefaultTempalte: @escaping (String) -> Void + onSetAsDefaultTemplate: @escaping (String) -> Void ) { - self.onSetAsDefaultTempalte = onSetAsDefaultTempalte + self.onSetAsDefaultTemplate = onSetAsDefaultTemplate let picker = TemplatePickerView(viewModel: .init(data: data, output: self)) let hostViewController = UIHostingController(rootView: picker) hostViewController.modalPresentationStyle = .fullScreen @@ -101,7 +101,7 @@ extension TemplatesCoordinator: TemplatePickerViewModuleOutput { func didCreateTemplate(templateId: String) {} func didTapUseTemplateAsDefault(templateId: String) { - onSetAsDefaultTempalte?(templateId) + onSetAsDefaultTemplate?(templateId) } func didUndoRedo() { diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Editing/TemplateEditingViewController.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Editing/TemplateEditingViewController.swift index c5b4200bbe..0bbcea9207 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Editing/TemplateEditingViewController.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Editing/TemplateEditingViewController.swift @@ -8,6 +8,10 @@ final class TemplateEditingViewController: UIViewController { private let editorViewController: UIViewController private let onSettingsTap: () -> Void private let onSelectTemplateTap: (() -> Void)? + private let objectId: String + private let spaceId: String + private weak var output: (any ObjectSettingsCoordinatorOutput)? + private var settingsMenuView: UIView? private lazy var keyboardHelper = KeyboardEventsListnerHelper( didShowAction: { [weak selectTemplateButton] _ in @@ -35,10 +39,16 @@ final class TemplateEditingViewController: UIViewController { init( editorViewController: UIViewController, + objectId: String, + spaceId: String, + output: any ObjectSettingsCoordinatorOutput, onSettingsTap: @escaping () -> Void, onSelectTemplateTap: (() -> Void)? ) { self.editorViewController = editorViewController + self.objectId = objectId + self.spaceId = spaceId + self.output = output self.onSettingsTap = onSettingsTap self.onSelectTemplateTap = onSelectTemplateTap @@ -54,8 +64,8 @@ final class TemplateEditingViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - setupLayout() setupView() + setupLayout() } @objc @@ -73,6 +83,13 @@ final class TemplateEditingViewController: UIViewController { settingsButton.setImage(UIImage(asset: .X24.more), for: .normal) settingsButton.addTarget(self, action: #selector(didTapSettingButton), for: .touchUpInside) settingsButton.tintColor = .Control.secondary + + if FeatureFlags.newObjectSettings, let output { + let menuContainer = ObjectSettingsMenuContainer(objectId: objectId, spaceId: spaceId, output: output) + let hostingController = UIHostingController(rootView: menuContainer) + hostingController.view.backgroundColor = .clear + self.settingsMenuView = hostingController.view + } } private func setupLayout() { @@ -89,9 +106,16 @@ final class TemplateEditingViewController: UIViewController { $0.centerY.equal(to: fakeNavigationView.centerYAnchor) } - fakeNavigationView.addSubview(settingsButton) { - $0.trailing.equal(to: fakeNavigationView.trailingAnchor, constant: -20) - $0.centerY.equal(to: fakeNavigationView.centerYAnchor) + if FeatureFlags.newObjectSettings, let settingsMenuView { + fakeNavigationView.addSubview(settingsMenuView) { + $0.trailing.equal(to: fakeNavigationView.trailingAnchor, constant: -20) + $0.centerY.equal(to: fakeNavigationView.centerYAnchor) + } + } else { + fakeNavigationView.addSubview(settingsButton) { + $0.trailing.equal(to: fakeNavigationView.trailingAnchor, constant: -20) + $0.centerY.equal(to: fakeNavigationView.centerYAnchor) + } } embedChild(editorViewController, into: view) diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerView.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerView.swift index 94c1bb74ab..8b81f993e5 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerView.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AnytypeCore struct TemplatePickerView: View { @StateObject var viewModel: TemplatePickerViewModel @@ -92,12 +93,23 @@ struct TemplatePickerView: View { } } + @ViewBuilder private var settingsButton: some View { - Button { - viewModel.onSettingsButtonTap() - } label: { - Image(asset: .X24.more) - .foregroundColor(.Control.secondary) + if FeatureFlags.newObjectSettings { + if viewModel.items.isNotEmpty { + ObjectSettingsMenuContainer( + objectId: viewModel.selectedItem().object.id, + spaceId: viewModel.spaceId, + output: viewModel.output + ) + } + } else { + Button { + viewModel.onSettingsButtonTap() + } label: { + Image(asset: .X24.more) + .foregroundColor(.Control.secondary) + } } } } diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerViewModel.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerViewModel.swift index ed5634120d..d4421cd9a3 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerViewModel.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Picker/TemplatePickerViewModel.swift @@ -3,7 +3,7 @@ import Services import SwiftUI @MainActor -protocol TemplatePickerViewModuleOutput: AnyObject { +protocol TemplatePickerViewModuleOutput: AnyObject, ObjectSettingsCoordinatorOutput { func onTemplatesChanged(_ templates: [ObjectDetails], completion: ([TemplatePickerData]) -> Void) func onTemplateSettingsTap(_ model: TemplatePickerViewModel.Item) func selectionOptionsView(_ provider: some OptionsItemProvider) -> AnyView @@ -40,7 +40,9 @@ final class TemplatePickerViewModel: ObservableObject, OptionsItemProvider { if case .objectTemplate = data.mode { return true } return false } - + + var spaceId: String { data.spaceId } + private let data: TemplatePickerViewModelData private var didSetupDefaultItem = false private var dismiss: DismissAction? @@ -49,8 +51,8 @@ final class TemplatePickerViewModel: ObservableObject, OptionsItemProvider { private var objectService: any ObjectActionsServiceProtocol @Injected(\.templatesSubscription) private var templatesSubscriptionService: any TemplatesSubscriptionServiceProtocol - - private weak var output: (any TemplatePickerViewModuleOutput)? + + weak var output: (any TemplatePickerViewModuleOutput)? // MARK: - OptionsItemProvider diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/Dataview/SetObjectCreationSettingsInteractor.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/Dataview/SetObjectCreationSettingsInteractor.swift index 9271e63d84..fa7ac3c2b6 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/Dataview/SetObjectCreationSettingsInteractor.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/Dataview/SetObjectCreationSettingsInteractor.swift @@ -62,7 +62,9 @@ final class SetObjectCreationSettingsInteractor: SetObjectCreationSettingsIntera private var typesService: any TypesServiceProtocol @Injected(\.dataviewService) private var dataviewService: any DataviewServiceProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + @Published private var templatesDetails = [ObjectDetails]() @Published private var defaultTemplateId: String @Published private var typeDefaultTemplateId: String = "" @@ -152,13 +154,16 @@ final class SetObjectCreationSettingsInteractor: SetObjectCreationSettingsIntera private func updateObjectTypes() { Task { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: setDocument.spaceId)?.uxType + let chatTypeVisible = spaceUxType?.supportsMultiChats ?? true + let includeChat = chatTypeVisible objectTypes = try await typesService.searchObjectTypes( - text: "", + text: "", includePins: true, includeLists: true, includeBookmarks: true, includeFiles: false, - includeChat: false, + includeChat: includeChat, includeTemplates: false, incudeNotForCreation: false, spaceId: setDocument.spaceId diff --git a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/SetObjectCreationSettingsViewModel.swift b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/SetObjectCreationSettingsViewModel.swift index e9d1dd9195..10a1fb1df0 100644 --- a/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/SetObjectCreationSettingsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/ObjectCreationSettings/Views/Selection/SetObjectCreationSettingsViewModel.swift @@ -15,7 +15,7 @@ protocol SetObjectCreationSettingsOutput: AnyObject { func onObjectTypesSearchAction(setDocument: some SetDocumentProtocol, completion: @escaping (ObjectType) -> Void) func templateEditingHandler( setting: ObjectCreationSetting, - onSetAsDefaultTempalte: @escaping (String) -> Void, + onSetAsDefaultTemplate: @escaping (String) -> Void, onTemplateSelection: ((ObjectCreationSetting) -> Void)? ) } @@ -95,10 +95,10 @@ final class SetObjectCreationSettingsViewModel: ObservableObject { guard let self else { return } do { let templateId = try await templatesService.createTemplateFromObjectType(objectTypeId: objectTypeId, spaceId: spaceId) - AnytypeAnalytics.instance().logTemplateCreate(objectType: .object(typeId: objectTypeId), spaceId: spaceId) + AnytypeAnalytics.instance().logTemplateCreate(objectType: .object(typeId: objectTypeId)) output?.templateEditingHandler( setting: ObjectCreationSetting(objectTypeId: objectTypeId, spaceId: spaceId, templateId: templateId), - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.setTemplateAsDefault(templateId: templateId) }, onTemplateSelection: data.onTemplateSelection @@ -221,7 +221,7 @@ final class SetObjectCreationSettingsViewModel: ObservableObject { case .editTemplate: output?.templateEditingHandler( setting: ObjectCreationSetting(objectTypeId: objectTypeId, spaceId: spaceId, templateId: templateViewModel.id), - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.setTemplateAsDefault(templateId: templateId) }, onTemplateSelection: data.onTemplateSelection diff --git a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchView.swift b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchView.swift index a36f52ff3c..c6c6358d08 100644 --- a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchView.swift +++ b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchView.swift @@ -213,7 +213,7 @@ struct ObjectTypeSearchView: View { } let isNotListLayout = data.type.recommendedLayout.flatMap { !$0.isList } ?? false - let canSetAsDefault = !data.isDefault && data.type.canCreateObjectOfThisType && isNotListLayout + let canSetAsDefault = !data.isDefault && data.type.canCreateObjectOfThisType && isNotListLayout && !data.type.isChatType if canSetAsDefault { Button(Loc.setAsDefault) { diff --git a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewModel.swift b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewModel.swift index d692e22f4a..c0294219ef 100644 --- a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewModel.swift +++ b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewModel.swift @@ -29,7 +29,9 @@ final class ObjectTypeSearchViewModel: ObservableObject { private var pasteboardHelper: any PasteboardHelperProtocol @Injected(\.participantsStorage) private var accountParticipantStorage: any ParticipantsStorageProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + private let onSelect: (TypeSelectionResult) -> Void private var searchTask: Task<(), any Error>? @@ -52,7 +54,7 @@ final class ObjectTypeSearchViewModel: ObservableObject { } func subscribeOnParticipant() async { - for await participant in accountParticipantStorage.participantPublisher(spaceId: spaceId).values { + for await participant in accountParticipantStorage.participantSequence(spaceId: spaceId) { participantCanEdit = participant.canEdit } } @@ -73,6 +75,9 @@ final class ObjectTypeSearchViewModel: ObservableObject { searchTask?.cancel() searchTask = Task { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType + let effectiveShowChat = settings.showChat && (spaceUxType?.supportsMultiChats ?? true) + let pinnedTypes = settings.showPins ? try await typesService.searchPinnedTypes(text: text, spaceId: spaceId) : [] let listTypes = settings.showLists ? try await typesService.searchListTypes( text: searchText, includePins: !settings.showPins, spaceId: spaceId @@ -83,7 +88,7 @@ final class ObjectTypeSearchViewModel: ObservableObject { includeLists: false, includeBookmarks: true, includeFiles: settings.showFiles, - includeChat: settings.showChat, + includeChat: effectiveShowChat, includeTemplates: settings.showTemplates, incudeNotForCreation: settings.incudeNotForCreation, spaceId: spaceId @@ -164,7 +169,7 @@ final class ObjectTypeSearchViewModel: ObservableObject { } func createType(name: String) { - newTypeInfo = CreateObjectTypeData(spaceId: spaceId, name: name) + newTypeInfo = CreateObjectTypeData(spaceId: spaceId, name: name, route: .screenObjectTypes) } func onCreateTypeSubmit(type: ObjectType) { diff --git a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewSettings.swift b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewSettings.swift index a179b8e176..b86614bd5b 100644 --- a/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewSettings.swift +++ b/Anytype/Sources/PresentationLayer/ObjectTypeSearch/ObjectTypeSearchViewSettings.swift @@ -25,7 +25,7 @@ extension ObjectTypeSearchViewSettings { showPins: false, showLists: true, showFiles: true, - showChat: false, + showChat: true, showTemplates: true, incudeNotForCreation: true, allowPaste: false, @@ -69,7 +69,7 @@ extension ObjectTypeSearchViewSettings { showPins: false, showLists: true, showFiles: true, - showChat: false, + showChat: true, showTemplates: true, incudeNotForCreation: true, allowPaste: false, diff --git a/Anytype/Sources/PresentationLayer/PropertyValueFlow/PropertyValueCoordinator/PropertyValueProcessingService.swift b/Anytype/Sources/PresentationLayer/PropertyValueFlow/PropertyValueCoordinator/PropertyValueProcessingService.swift index 4904f7ada8..19de1f9d71 100644 --- a/Anytype/Sources/PresentationLayer/PropertyValueFlow/PropertyValueCoordinator/PropertyValueProcessingService.swift +++ b/Anytype/Sources/PresentationLayer/PropertyValueFlow/PropertyValueCoordinator/PropertyValueProcessingService.swift @@ -43,8 +43,7 @@ fileprivate final class PropertyValueProcessingService: PropertyValueProcessingS isEmpty: !newValue, format: relationDetails.format, type: analyticsType, - key: relationDetails.analyticsKey, - spaceId: objectDetails.spaceId + key: relationDetails.analyticsKey ) } case .unknown: diff --git a/Anytype/Sources/PresentationLayer/SecureAlert/SecureAlertView.swift b/Anytype/Sources/PresentationLayer/SecureAlert/SecureAlertView.swift index fd3e01d545..4055c4b4f1 100644 --- a/Anytype/Sources/PresentationLayer/SecureAlert/SecureAlertView.swift +++ b/Anytype/Sources/PresentationLayer/SecureAlert/SecureAlertView.swift @@ -48,3 +48,7 @@ struct SecureAlertView: View { } } } + +#Preview { + SecureAlertView(data: SecureAlertData(completion: { _ in })) +} diff --git a/Anytype/Sources/PresentationLayer/Settings/Appearance/SettingsAppearanceView.swift b/Anytype/Sources/PresentationLayer/Settings/Appearance/SettingsAppearanceView.swift index becb7a58e2..ca5ecba94d 100644 --- a/Anytype/Sources/PresentationLayer/Settings/Appearance/SettingsAppearanceView.swift +++ b/Anytype/Sources/PresentationLayer/Settings/Appearance/SettingsAppearanceView.swift @@ -20,9 +20,7 @@ struct SettingsAppearanceView: View { Spacer.fixedHeight(12) appearanceType - #if !RELEASE_ANYAPP - iconPicker - #endif + iconPicker Spacer.fixedHeight(20) } diff --git a/Anytype/Sources/PresentationLayer/Settings/PushNotifications/DisabledPushNotificationsBanner/DisabledPushNotificationsBannerView.swift b/Anytype/Sources/PresentationLayer/Settings/PushNotifications/DisabledPushNotificationsBanner/DisabledPushNotificationsBannerView.swift index 08943fec31..f9a5da1353 100644 --- a/Anytype/Sources/PresentationLayer/Settings/PushNotifications/DisabledPushNotificationsBanner/DisabledPushNotificationsBannerView.swift +++ b/Anytype/Sources/PresentationLayer/Settings/PushNotifications/DisabledPushNotificationsBanner/DisabledPushNotificationsBannerView.swift @@ -56,3 +56,7 @@ struct DisabledPushNotificationsBannerView: View { .cornerRadius(12, style: .continuous) } } + +#Preview { + DisabledPushNotificationsBannerView() +} diff --git a/Anytype/Sources/PresentationLayer/Settings/Settings/SettingsView.swift b/Anytype/Sources/PresentationLayer/Settings/Settings/SettingsView.swift index 11ed282aa2..503746c887 100644 --- a/Anytype/Sources/PresentationLayer/Settings/Settings/SettingsView.swift +++ b/Anytype/Sources/PresentationLayer/Settings/Settings/SettingsView.swift @@ -40,16 +40,14 @@ struct SettingsView: View { imageAsset: .Settings.appearance, onTap: { model.onAppearanceTap() } ) - - if FeatureFlags.addNotificationsSettings { - SettingsSectionItemView( - name: Loc.notifications, - imageAsset: .Settings.notifications, - decoration: .arrow(needAttention: model.notificationsDenied), - onTap: { model.onNotificationsTap() } - ) - } - + + SettingsSectionItemView( + name: Loc.notifications, + imageAsset: .Settings.notifications, + decoration: .arrow(needAttention: model.notificationsDenied), + onTap: { model.onNotificationsTap() } + ) + SettingsSectionItemView( name: Loc.loginKey, imageAsset: .Settings.keychainPhrase, diff --git a/Anytype/Sources/PresentationLayer/SpaceSettings/RemoteStorage/RemoteStorageViewModel.swift b/Anytype/Sources/PresentationLayer/SpaceSettings/RemoteStorage/RemoteStorageViewModel.swift index 282f5738b9..3b2617de62 100644 --- a/Anytype/Sources/PresentationLayer/SpaceSettings/RemoteStorage/RemoteStorageViewModel.swift +++ b/Anytype/Sources/PresentationLayer/SpaceSettings/RemoteStorage/RemoteStorageViewModel.swift @@ -97,11 +97,11 @@ final class RemoteStorageViewModel: ObservableObject { private func updateView(nodeUsage: NodeUsageInfo) { let bytesUsed = nodeUsage.node.bytesUsage let bytesLimit = nodeUsage.node.bytesLimit - + let used = byteCountFormatter.string(fromByteCount: bytesUsed) let limit = byteCountFormatter.string(fromByteCount: bytesLimit) - - spaceInstruction = Loc.FileStorage.Space.instruction(limit) + + spaceInstruction = Loc.FileStorage.Space.instruction spaceUsed = Loc.FileStorage.Space.used(used, limit) let percentUsage = Double(bytesUsed) / Double(bytesLimit) let percentToShowGetMoreButton = 0.7 diff --git a/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsView.swift b/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsView.swift index 524297db54..dec58f11c5 100644 --- a/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsView.swift +++ b/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsView.swift @@ -191,14 +191,12 @@ struct SpaceSettingsView: View { SectionHeaderView(title: Loc.collaboration) VStack(spacing: 8) { RoundedButton(Loc.members, icon: .X24.member, decoration: memberDecoration) { model.onMembersTap() } - if FeatureFlags.muteSpacePossibility { - RoundedButton( - Loc.notifications, - icon: pushNotificationsSettingIcon(), - decoration: .caption(pushNotificationsSettingCaption())) { - model.onNotificationsTap() - } - } + RoundedButton( + Loc.notifications, + icon: pushNotificationsSettingIcon(), + decoration: .caption(pushNotificationsSettingCaption())) { + model.onNotificationsTap() + } if let data = model.uxTypeSettingsData { RoundedButton( Loc.channelType, diff --git a/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift b/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift index dd819ea037..b079bd5898 100644 --- a/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/SpaceSettings/SpaceSettings/SpaceSettingsViewModel.swift @@ -273,7 +273,7 @@ final class SpaceSettingsViewModel: ObservableObject { allowRemoteStorage = participantSpaceView.isOwner canAddWriters = spaceView.canAddWriters(participants: participants) - uxTypeSettingsData = participantSpaceView.canChangeUxType && spaceView.hasChat ? SpaceUxTypeSettingsData(uxType: spaceView.uxType) : nil + uxTypeSettingsData = participantSpaceView.canChangeUxType && spaceView.hasChat && FeatureFlags.channelTypeSwitcher ? SpaceUxTypeSettingsData(uxType: spaceView.uxType) : nil info = spaceSettingsInfoBuilder.build(workspaceInfo: workspaceInfo, details: spaceView, owner: owner) { [weak self] in self?.snackBarData = ToastBarData(Loc.copiedToClipboard($0)) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/Mention/MentionViewController/MentionsViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/Mention/MentionViewController/MentionsViewModel.swift index ab75b53484..710407a4a2 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/Mention/MentionViewController/MentionsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/Mention/MentionViewController/MentionsViewModel.swift @@ -21,7 +21,9 @@ final class MentionsViewModel { private var defaultObjectService: any DefaultObjectCreationServiceProtocol @Injected(\.objectDateByTimestampService) private var objectDateByTimestampService: any ObjectDateByTimestampServiceProtocol - + @Injected(\.spaceViewsStorage) + private var spaceViewsStorage: any SpaceViewsStorageProtocol + private var searchTask: Task<(), any Error>? private let router: any EditorRouterProtocol @@ -51,14 +53,17 @@ final class MentionsViewModel { updatedMentions.append(contentsOf: dateMentions.map { .mention($0) }) updatedMentions.append(.selectDate) } - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: document.spaceId)?.uxType + let objectLayouts = DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType) - [.date] + let objectsMentions = try await mentionService.searchMentions( spaceId: document.spaceId, text: filterString, excludedObjectIds: [document.objectId], - limitLayout: DetailsLayout.visibleLayoutsWithFiles - [.date] + limitLayout: objectLayouts ) - + if objectsMentions.isNotEmpty { updatedMentions.append(.header(title: Loc.objects)) updatedMentions.append(contentsOf: objectsMentions.map { .mention($0) }) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/SlashMenu/Handler/SlashMenuActionHandler.swift b/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/SlashMenu/Handler/SlashMenuActionHandler.swift index d20723d520..2add22d9c9 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/SlashMenu/Handler/SlashMenuActionHandler.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/AccessoryView/SlashMenu/Handler/SlashMenuActionHandler.swift @@ -56,7 +56,7 @@ final class SlashMenuActionHandler { } case .objectType(let typeDetails): let objectType = ObjectType(details: typeDetails) - AnytypeAnalytics.instance().logCreateLink(spaceId: objectType.spaceId, objectType: objectType.analyticsType, route: .slashMenu) + AnytypeAnalytics.instance().logCreateLink(objectType: objectType.analyticsType, route: .slashMenu) try await actionHandler .createPage( targetId: blockInformation.id, @@ -72,7 +72,7 @@ final class SlashMenuActionHandler { case let .relations(action): switch action { case .newRealtion: - router.showAddPropertyInfoView(document: document) { [weak self, spaceId = document.spaceId] relation, isNew in + router.showAddPropertyInfoView(document: document) { [weak self] relation, isNew in Task { try await self?.actionHandler.addBlock(.relation(key: relation.key), blockId: blockInformation.id, blockText: textView?.attributedText.sendable()) } @@ -81,7 +81,6 @@ final class SlashMenuActionHandler { isNew: isNew, type: .block, key: relation.analyticsKey, - spaceId: spaceId, route: .slashMenu ) } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/File/Image/BlockImageViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/File/Image/BlockImageViewModel.swift index 748c2d4971..250e697c45 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/File/Image/BlockImageViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/File/Image/BlockImageViewModel.swift @@ -4,7 +4,7 @@ import Combine import AnytypeCore @MainActor -struct BlockImageViewModel: BlockViewModelProtocol { +final class BlockImageViewModel: BlockViewModelProtocol { typealias Action = (_ arg: T) -> Void @Injected(\.openedDocumentProvider) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/SimpleTable/Block/TextBlock/SimpleTablesTextBlockActionHandler.swift b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/SimpleTable/Block/TextBlock/SimpleTablesTextBlockActionHandler.swift index 562105a9e0..8e18300be3 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/SimpleTable/Block/TextBlock/SimpleTablesTextBlockActionHandler.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/SimpleTable/Block/TextBlock/SimpleTablesTextBlockActionHandler.swift @@ -265,7 +265,7 @@ final class SimpleTablesTextBlockActionHandler: TextBlockActionHandlerProtocol, } private func copy(range: NSRange) { - AnytypeAnalytics.instance().logCopyBlock(spaceId: document.spaceId, countBlocks: 1) + AnytypeAnalytics.instance().logCopyBlock(countBlocks: 1) Task { try await pasteboardService?.copy(document: document, blocksIds: [info.id], selectedTextRange: range) } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/Text/Base/TextBlockActionHandler.swift b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/Text/Base/TextBlockActionHandler.swift index 268f5905fb..6e70f69860 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/Text/Base/TextBlockActionHandler.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/BlocksViews/Blocks/Text/Base/TextBlockActionHandler.swift @@ -357,7 +357,7 @@ final class TextBlockActionHandler: TextBlockActionHandlerProtocol, LinkToSearch } private func copy(range: NSRange) { - AnytypeAnalytics.instance().logCopyBlock(spaceId: document.spaceId, countBlocks: 1) + AnytypeAnalytics.instance().logCopyBlock(countBlocks: 1) Task { try await pasteboardService?.copy(document: document, blocksIds: [info.id], selectedTextRange: range) } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageBlocksStateManager.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageBlocksStateManager.swift index 67907d9dba..df6b9f7224 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageBlocksStateManager.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageBlocksStateManager.swift @@ -537,7 +537,7 @@ final class EditorPageBlocksStateManager: EditorPageBlocksStateManagerProtocol { } } - AnytypeAnalytics.instance().logCopyBlock(spaceId: document.spaceId, countBlocks: blocksIds.count) + AnytypeAnalytics.instance().logCopyBlock(countBlocks: blocksIds.count) Task { @MainActor [blocksIds] in try await pasteboardService.copy(document: document, blocksIds: blocksIds, selectedTextRange: NSRange()) toastPresenter.show(message: Loc.copied) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageController.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageController.swift index c1884e5482..d29609d6e4 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageController.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/EditorPageController.swift @@ -54,11 +54,14 @@ final class EditorPageController: UIViewController { private lazy var navigationBarHelper: EditorNavigationBarHelper = EditorNavigationBarHelper( navigationBarView: navigationBarView, - navigationBarBackgroundView: navigationBarBackgroundView, + navigationBarBackgroundView: navigationBarBackgroundView, + objectId: viewModel.document.objectId, + spaceId: viewModel.document.spaceId, + output: viewModel.router, onSettingsBarButtonItemTap: { [weak viewModel] in UISelectionFeedbackGenerator().selectionChanged() viewModel?.showSettings() - }, + }, onSelectAllBarButtonItemTap: { [weak self] allSelected in self?.handleSelectState(allSelected: allSelected) }, @@ -67,7 +70,7 @@ final class EditorPageController: UIViewController { }, onTemplatesButtonTap: { [weak viewModel] in viewModel?.showTemplates() - }, + }, onSyncStatusTap: { [weak viewModel] in UISelectionFeedbackGenerator().selectionChanged() viewModel?.showSyncStatusInfo() @@ -560,10 +563,6 @@ private extension EditorPageController { for: indexPath, item: block ) - - if !FeatureFlags.fixCollectionViewReuseCrashInEditor { - cell.contentConfiguration = block.makeContentConfiguration(maxWidth: collectionView.frame.width) - } case let .header(header): return collectionView.dequeueConfiguredReusableCell( using: headerCellRegistration, diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Models/BlockViewModelBuilder.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Models/BlockViewModelBuilder.swift index 781cc171b9..cac22757b1 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Models/BlockViewModelBuilder.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Models/BlockViewModelBuilder.swift @@ -414,7 +414,7 @@ final class BlockViewModelBuilder { Task { [weak self] in guard let self else { return } try await handler.setObjectType(type: type) - AnytypeAnalytics.instance().logChangeObjectType(type.analyticsType, spaceId: document.spaceId, route: route) + AnytypeAnalytics.instance().logChangeObjectType(type.analyticsType, route: route) guard let isSelectTemplate = document.details?.isSelectTemplate, isSelectTemplate else { return } try await handler.applyTemplate(objectId: document.objectId, templateId: type.defaultTemplateId) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Utils/EditorNavigationBarHelper/EditorNavigationBarHelper.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Utils/EditorNavigationBarHelper/EditorNavigationBarHelper.swift index b45855246d..eee872d88d 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Utils/EditorNavigationBarHelper/EditorNavigationBarHelper.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Utils/EditorNavigationBarHelper/EditorNavigationBarHelper.swift @@ -2,6 +2,7 @@ import Foundation import UIKit import Services import SwiftUI +import AnytypeCore @MainActor final class EditorNavigationBarHelper { @@ -16,6 +17,7 @@ final class EditorNavigationBarHelper { private let selectAllButton: UIButton private let settingsItem: UIEditorBarButtonItem + private let settingsMenuView: UIView? private let syncStatusItem: EditorSyncStatusItem private let webBannerItem: EditorWebBannerItem private let rightContanerForEditing: UIView @@ -38,6 +40,9 @@ final class EditorNavigationBarHelper { init( navigationBarView: EditorNavigationBarView, navigationBarBackgroundView: UIView, + objectId: String, + spaceId: String, + output: (any ObjectSettingsCoordinatorOutput)?, onSettingsBarButtonItemTap: @escaping () -> Void, onSelectAllBarButtonItemTap: @escaping (Bool) -> Void, onDoneBarButtonItemTap: @escaping () -> Void, @@ -48,6 +53,16 @@ final class EditorNavigationBarHelper { self.navigationBarView = navigationBarView self.navigationBarBackgroundView = navigationBarBackgroundView self.settingsItem = UIEditorBarButtonItem(imageAsset: .X24.more, action: onSettingsBarButtonItemTap) + + if FeatureFlags.newObjectSettings { + let menuContainer = ObjectSettingsMenuContainer(objectId: objectId, spaceId: spaceId, output: output) + let hostingController = UIHostingController(rootView: menuContainer) + hostingController.view.backgroundColor = .clear + self.settingsMenuView = hostingController.view + } else { + self.settingsMenuView = nil + } + self.syncStatusItem = EditorSyncStatusItem(onTap: onSyncStatusTap) self.webBannerItem = EditorWebBannerItem(onTap: onWebBannerTap) @@ -94,11 +109,19 @@ final class EditorNavigationBarHelper { ) self.rightContanerForEditing.layoutUsing.stack { - $0.hStack( - spacing: 12, - syncStatusItem, - settingsItem - ) + if FeatureFlags.newObjectSettings, let settingsMenuView { + $0.hStack( + spacing: 12, + syncStatusItem, + settingsMenuView + ) + } else { + $0.hStack( + spacing: 12, + syncStatusItem, + settingsItem + ) + } } navigationBarView.bannerView = webBannerItem diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/ContextualMenu/EditorContextualMenu.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/ContextualMenu/EditorContextualMenu.swift index fb9766cfa4..6ab496c522 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/ContextualMenu/EditorContextualMenu.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/ContextualMenu/EditorContextualMenu.swift @@ -24,23 +24,27 @@ struct EditorContextualMenuView: View { let optionTapHandler: (EditorContextualOption) -> Void var body: some View { - VStack(alignment: .center, spacing: 0) { - Spacer.fixedHeight(8) + VStack(alignment: .leading, spacing: 0) { + Spacer.fixedHeight(12) ForEach(options) { option in Button { optionTapHandler(option) } label: { - Text(verbatim: option.localisedString) - .foregroundColor(Color.Text.primary) - .font(AnytypeFontBuilder.font(anytypeFont: .uxCalloutRegular)) - .padding(.leading, 16) - .frame(maxWidth: .infinity, minHeight: 28, alignment: .leading) - .fixTappableArea() + HStack { + Text(verbatim: option.localisedString) + .frame(alignment: .leading) + .foregroundColor(Color.Text.primary) + .font(AnytypeFontBuilder.font(anytypeFont: .bodyRegular)) + .padding(.vertical, 9) + .padding(.leading, 24) + .fixTappableArea() + Spacer() + } } - .frame(minWidth: 208, maxWidth: 224, minHeight: 28, maxHeight: 43.5) + .frame(width: 252, height: 40) .buttonStyle(TertiaryPressedBackgroundButtonStyle()) } - Spacer.fixedHeight(8) + Spacer.fixedHeight(12) } } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Header/Filled/ObjectHeaderFilledContentView.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Header/Filled/ObjectHeaderFilledContentView.swift index 7c4952c63e..e2d62b6961 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Header/Filled/ObjectHeaderFilledContentView.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Header/Filled/ObjectHeaderFilledContentView.swift @@ -74,7 +74,10 @@ final class ObjectHeaderFilledContentView: UIView, BlockContentView { withHorizontalFittingPriority: .defaultHigh, verticalFittingPriority: .fittingSizeLevel ) - invalidateIntrinsicContentSize() + UIView.performWithoutAnimation { + invalidateIntrinsicContentSize() + superview?.layoutIfNeeded() + } } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Icon/Common/Emoji/EmojiGridView.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Icon/Common/Emoji/EmojiGridView.swift index 484ae55e23..275e4013bc 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Icon/Common/Emoji/EmojiGridView.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Icon/Common/Emoji/EmojiGridView.swift @@ -6,7 +6,7 @@ struct EmojiGridView: View { let onEmojiSelect: (EmojiData) -> () @State private var searchText = "" - @State private var filteredGroups: [EmojiGroup] = [] + @State private var filteredEmojis: [EmojiData] = [] private let columns = [ GridItem(.flexible()), @@ -23,29 +23,26 @@ struct EmojiGridView: View { contentView } .onAppear { - updateFilteredGroups() + updateFilteredEmojis() } .onChange(of: searchText) { - updateFilteredGroups() + updateFilteredEmojis() } } - // MARK: - Private variables - private var contentView: some View { Group { - if filteredGroups.isEmpty { + if filteredEmojis.isEmpty { makeEmptySearchResultView(placeholder: searchText) - } else if filteredGroups.haveFewEmoji { - makeEmojiGrid(groups: filteredGroups.flattenedList) } else { - makeEmojiGrid(groups: filteredGroups) + makeEmojiGrid(emojis: filteredEmojis) } } } - private func updateFilteredGroups() { - filteredGroups = EmojiProvider.shared.filteredEmojiGroups(keyword: searchText) + private func updateFilteredEmojis() { + let groups = EmojiProvider.shared.filteredEmojiGroups(keyword: searchText) + filteredEmojis = groups.flatMap { $0.emojis } } private func makeEmptySearchResultView(placeholder: String) -> some View { @@ -69,55 +66,26 @@ struct EmojiGridView: View { .padding(.horizontal, 16) } - private func makeEmojiGrid(groups: [EmojiGroup]) -> some View { + private func makeEmojiGrid(emojis: [EmojiData]) -> some View { ScrollView(showsIndicators: false) { - makeGridView(groups: groups) - } - .scrollDismissesKeyboard(.interactively) - .padding(.horizontal, 16) - } - - private func makeGridView(groups: [EmojiGroup]) -> some View { - LazyVGrid( - columns: columns, - spacing: 0 - ) { - ForEach(groups, id: \.name) { group in - Section(header: sectionHeader(with: group.name)) { - ForEach(group.emojis.indices, id: \.self) { index in - Button { - group.emojis[safe: index].flatMap { - onEmojiSelect($0) - } - } label: { - emojiGridView(at: index, inEmojis: group.emojis) + LazyVGrid(columns: columns, spacing: 12) { + ForEach(emojis.indices, id: \.self) { index in + Button { + emojis[safe: index].flatMap { + onEmojiSelect($0) + } + } label: { + emojis[safe: index].map { emoji in + Text(verbatim: emoji.emoji) + .font(.system(size: 40)) } } } } + .padding(.top, 12) } - } - - @ViewBuilder - private func sectionHeader(with name: String) -> some View { - if name.isNotEmpty { - VStack(spacing: 0) { - PickerSectionHeaderView(title: name) - Spacer.fixedHeight(15) - } - } else { - Spacer.fixedHeight(12) - } - } - - private func emojiGridView(at index: Int, inEmojis emojis: [EmojiData]) -> some View { - emojis[safe: index].flatMap { emoji in - Text(verbatim: emoji.emoji) - .font(.system(size: 40)) - .if(index > columns.count - 1) { - $0.padding(.top, 12) - } - } + .scrollDismissesKeyboard(.interactively) + .padding(.horizontal, 16) } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectAction.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectAction.swift index c6193fd920..a17a3c24d5 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectAction.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectAction.swift @@ -83,4 +83,29 @@ enum ObjectAction: Hashable, Identifiable { return "copyLink" } } + + var menuOrder: Int { + switch self { + case .pin: + return 10 + case .undoRedo: + return 11 + case .linkItself: + return 20 + case .makeAsTemplate: + return 21 + case .templateToggleDefaultState: + return 22 + case .locked: + return 30 + case .copyLink: + return 40 + case .duplicate: + return 41 + case .archive: + return 42 + case .delete: + return 43 + } + } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionRow.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionRow.swift index 5dd825f2ea..09ad10de39 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionRow.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionRow.swift @@ -45,7 +45,7 @@ extension ObjectActionRow { } } -private extension ObjectAction { +extension ObjectAction { var title: String { switch self { diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsView.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsView.swift index eca0141cf8..dbc7c7aef1 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsView.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsView.swift @@ -2,12 +2,12 @@ import SwiftUI import AnytypeCore struct ObjectActionsView: View { - - @StateObject private var viewModel: ObjectActionsViewModel + + @State private var viewModel: ObjectActionsViewModel @Environment(\.dismiss) private var dismiss - + init(objectId: String, spaceId: String, output: (any ObjectActionsOutput)?) { - self._viewModel = StateObject(wrappedValue: ObjectActionsViewModel(objectId: objectId, spaceId: spaceId, output: output)) + self._viewModel = State(wrappedValue: ObjectActionsViewModel(objectId: objectId, spaceId: spaceId, output: output)) } var body: some View { @@ -29,7 +29,7 @@ struct ObjectActionsView: View { case .linkItself: viewModel.linkItselfAction() case .makeAsTemplate: - try await viewModel.makeAsTempalte() + try await viewModel.makeAsTemplate() case .templateToggleDefaultState: try await viewModel.templateToggleDefaultState() case .delete: diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsViewModel.swift index 963c8c4535..047b06bf68 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectActions/ObjectActionsViewModel.swift @@ -1,21 +1,26 @@ import Foundation -import Combine import Services import AnytypeCore import UIKit import DeepLinks @MainActor -final class ObjectActionsViewModel: ObservableObject { +@Observable +final class ObjectActionsViewModel { + @ObservationIgnored private let objectId: String + @ObservationIgnored private let spaceId: String + @ObservationIgnored private weak var output: (any ObjectActionsOutput)? - + + @ObservationIgnored private lazy var document: any BaseDocumentProtocol = { openDocumentsProvider.document(objectId: objectId, spaceId: spaceId) }() - + + @ObservationIgnored private lazy var widgetObject: (any BaseDocumentProtocol)? = { guard let info = workspaceStorage.spaceInfo(spaceId: spaceId) else { anytypeAssertionFailure("info not found") @@ -23,31 +28,31 @@ final class ObjectActionsViewModel: ObservableObject { } return openDocumentsProvider.document(objectId: info.widgetsId, spaceId: spaceId) }() - - @Injected(\.objectActionsService) + + @Injected(\.objectActionsService) @ObservationIgnored private var service: any ObjectActionsServiceProtocol - @Injected(\.blockService) + @Injected(\.blockService) @ObservationIgnored private var blockService: any BlockServiceProtocol - @Injected(\.templatesService) + @Injected(\.templatesService) @ObservationIgnored private var templatesService: any TemplatesServiceProtocol - @Injected(\.documentsProvider) + @Injected(\.documentsProvider) @ObservationIgnored private var documentsProvider: any DocumentsProviderProtocol - @Injected(\.blockWidgetService) + @Injected(\.blockWidgetService) @ObservationIgnored private var blockWidgetService: any BlockWidgetServiceProtocol - @Injected(\.spaceViewsStorage) + @Injected(\.spaceViewsStorage) @ObservationIgnored private var workspaceStorage: any SpaceViewsStorageProtocol - @Injected(\.deepLinkParser) + @Injected(\.deepLinkParser) @ObservationIgnored private var deepLinkParser: any DeepLinkParserProtocol - @Injected(\.universalLinkParser) + @Injected(\.universalLinkParser) @ObservationIgnored private var universalLinkParser: any UniversalLinkParserProtocol - @Injected(\.openedDocumentProvider) + @Injected(\.openedDocumentProvider) @ObservationIgnored private var openDocumentsProvider: any OpenedDocumentsProviderProtocol - @Injected(\.workspaceService) + @Injected(\.workspaceService) @ObservationIgnored private var workspaceService: any WorkspaceServiceProtocol - - @Published var objectActions: [ObjectAction] = [] - @Published var toastData: ToastBarData? - @Published var dismiss = false + + var objectActions: [ObjectAction] = [] + var toastData: ToastBarData? + var dismiss = false init(objectId: String, spaceId: String, output: (any ObjectActionsOutput)?) { self.objectId = objectId @@ -110,18 +115,22 @@ final class ObjectActionsViewModel: ObservableObject { position: first.map { .above(widgetId: $0.id) } ?? .end ) } + toastData = ToastBarData(pinned ? Loc.unpinned : Loc.pinned) dismiss.toggle() } func changeLockState() async throws { - AnytypeAnalytics.instance().logLockPage(!document.isLocked) - try await service.setLocked(!document.isLocked, objectId: objectId) + let isCurrentlyLocked = document.isLocked + AnytypeAnalytics.instance().logLockPage(!isCurrentlyLocked) + try await service.setLocked(!isCurrentlyLocked, objectId: objectId) + toastData = ToastBarData(isCurrentlyLocked ? Loc.unlocked : Loc.locked) + dismiss.toggle() } func duplicateAction() async throws { guard let details = document.details else { return } - AnytypeAnalytics.instance().logDuplicateObject(count: 1, objectType: details.objectType.analyticsType, spaceId: details.spaceId) + AnytypeAnalytics.instance().logDuplicateObject(count: 1, objectType: details.objectType.analyticsType) let duplicatedId = try await service.duplicate(objectId: objectId) @@ -140,7 +149,7 @@ final class ObjectActionsViewModel: ObservableObject { output?.onLinkItselfAction(onSelect: onObjectSelection) } - func makeAsTempalte() async throws { + func makeAsTemplate() async throws { guard let details = document.details else { return } let templateId = try await templatesService.createTemplateFromObject(objectId: details.id) @@ -209,7 +218,7 @@ final class ObjectActionsViewModel: ObservableObject { objectIds: [currentObjectId] ) output?.onLinkItselfToObjectHandler(data: details.screenData()) - AnytypeAnalytics.instance().logLinkToObject(type: .collection, spaceId: details.spaceId) + AnytypeAnalytics.instance().logLinkToObject(type: .collection) } else { let info = BlockInformation.emptyLink(targetId: currentObjectId) AnytypeAnalytics.instance().logCreateBlock(type: info.content.type, spaceId: details.spaceId) @@ -220,7 +229,7 @@ final class ObjectActionsViewModel: ObservableObject { position: .bottom ) output?.onLinkItselfToObjectHandler(data: details.screenData()) - AnytypeAnalytics.instance().logLinkToObject(type: .object, spaceId: details.spaceId) + AnytypeAnalytics.instance().logLinkToObject(type: .object) } } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/Model/ObjectSetting.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/Model/ObjectSetting.swift index afcb8e0c8e..8f8d29b090 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/Model/ObjectSetting.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/Model/ObjectSetting.swift @@ -26,15 +26,34 @@ extension ObjectSetting { return .object } } - + + var menuOrder: Int { + switch self { + case .relations: + return 0 + case .icon: + return 1 + case .cover: + return 2 + case .description: + return 10 + case .resolveConflict: + return 11 + case .webPublishing: + return 12 + case .history: + return 21 + } + } + var title: String { switch self { case .icon: Loc.icon case .cover: Loc.cover - case .description: - Loc.description + case .description(let isVisible): + isVisible ? Loc.hideDescription : Loc.showDescription case .relations: Loc.fields case .history: diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsView.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsView.swift index 2584c9a502..061de8b8a7 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsView.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsView.swift @@ -3,15 +3,15 @@ import Services import AnytypeCore struct ObjectSettingsView: View { - - @StateObject private var viewModel: ObjectSettingsViewModel - + + @State private var viewModel: ObjectSettingsViewModel + init( objectId: String, spaceId: String, output: some ObjectSettingsModelOutput ) { - self._viewModel = StateObject(wrappedValue: ObjectSettingsViewModel(objectId: objectId, spaceId: spaceId, output: output)) + self._viewModel = State(wrappedValue: ObjectSettingsViewModel(objectId: objectId, spaceId: spaceId, output: output)) } var body: some View { diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsViewModel.swift index 5b5a476431..ab5edc87a6 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettings/ObjectSettingsViewModel.swift @@ -1,5 +1,4 @@ import Foundation -import Combine import Services import UIKit import FloatingPanel @@ -26,27 +25,32 @@ protocol ObjectSettingsModelOutput: AnyObject, ObjectHeaderRouterProtocol, Objec } @MainActor -final class ObjectSettingsViewModel: ObservableObject, ObjectActionsOutput { +@Observable +final class ObjectSettingsViewModel: ObjectActionsOutput { - @Injected(\.openedDocumentProvider) + @Injected(\.openedDocumentProvider) @ObservationIgnored private var openDocumentsProvider: any OpenedDocumentsProviderProtocol - @Injected(\.propertiesService) + @Injected(\.propertiesService) @ObservationIgnored private var propertiesService: any PropertiesServiceProtocol - @Injected(\.objectSettingsBuilder) + @Injected(\.objectSettingsBuilder) @ObservationIgnored private var settingsBuilder: any ObjectSettingsBuilderProtocol - @Injected(\.objectSettingsConflictManager) + @Injected(\.objectSettingsConflictManager) @ObservationIgnored private var conflictManager: any ObjectSettingsPrimitivesConflictManagerProtocol - + + @ObservationIgnored private weak var output: (any ObjectSettingsModelOutput)? - + + @ObservationIgnored private lazy var document: any BaseDocumentProtocol = { openDocumentsProvider.document(objectId: objectId, spaceId: spaceId) }() - + + @ObservationIgnored let objectId: String + @ObservationIgnored let spaceId: String - @Published var settings: [ObjectSetting] = [] - @Published var showConflictAlert = false + var settings: [ObjectSetting] = [] + var showConflictAlert = false init( objectId: String, diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuItem.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuItem.swift new file mode 100644 index 0000000000..0489e6c9da --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuItem.swift @@ -0,0 +1,24 @@ +import Foundation + +enum ObjectMenuItem: Identifiable { + case setting(ObjectSetting) + case action(ObjectAction) + + var id: String { + switch self { + case .setting(let setting): + return "setting-\(setting.title)" + case .action(let action): + return "action-\(action.id)" + } + } + + var order: Int { + switch self { + case .setting(let setting): + return setting.menuOrder + case .action(let action): + return action.menuOrder + } + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSection.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSection.swift new file mode 100644 index 0000000000..82e61aa63e --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSection.swift @@ -0,0 +1,20 @@ +import Foundation + +enum ObjectMenuSectionLayout { + case horizontal + case vertical +} + +struct ObjectMenuConfiguration { + let sections: [ObjectMenuSection] +} + +struct ObjectMenuSection: Identifiable { + let items: [ObjectMenuItem] + let layout: ObjectMenuSectionLayout + let showDividerBefore: Bool + + var id: String { + items.map { $0.id }.joined(separator: "-") + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSectionType.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSectionType.swift new file mode 100644 index 0000000000..db92dc721e --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/Models/ObjectMenuSectionType.swift @@ -0,0 +1,35 @@ +import Foundation + +enum ObjectMenuSectionType { + case horizontal + case mainSettings + case objectActions + case management + case finalActions +} + +extension ObjectMenuSectionType { + static func section(for setting: ObjectSetting) -> ObjectMenuSectionType { + switch setting { + case .icon, .cover, .relations: + return .horizontal + case .description, .resolveConflict, .webPublishing: + return .mainSettings + case .history: + return .management + } + } + + static func section(for action: ObjectAction) -> ObjectMenuSectionType { + switch action { + case .pin, .undoRedo: + return .mainSettings + case .linkItself, .makeAsTemplate, .templateToggleDefaultState: + return .objectActions + case .locked: + return .management + case .copyLink, .duplicate, .archive, .delete: + return .finalActions + } + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectMenuBuilder.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectMenuBuilder.swift new file mode 100644 index 0000000000..6292cc4823 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectMenuBuilder.swift @@ -0,0 +1,53 @@ +import Foundation + +struct ObjectMenuBuilder { + static func buildMenu(settings: [ObjectSetting], actions: [ObjectAction]) -> ObjectMenuConfiguration { + let allItems = settings.map { (ObjectMenuSectionType.section(for: $0), ObjectMenuItem.setting($0)) } + + actions.map { (ObjectMenuSectionType.section(for: $0), ObjectMenuItem.action($0)) } + let grouped = Dictionary(grouping: allItems, by: { $0.0 }) + + var sections: [ObjectMenuSection] = [] + + if let items = grouped[.horizontal]?.map({ $0.1 }), !items.isEmpty { + sections.append(ObjectMenuSection( + items: items.sorted { $0.order < $1.order }, + layout: .horizontal, + showDividerBefore: false + )) + } + + if let items = grouped[.mainSettings]?.map({ $0.1 }), !items.isEmpty { + sections.append(ObjectMenuSection( + items: items.sorted { $0.order < $1.order }, + layout: .vertical, + showDividerBefore: false + )) + } + + if let items = grouped[.objectActions]?.map({ $0.1 }), !items.isEmpty { + sections.append(ObjectMenuSection( + items: items.sorted { $0.order < $1.order }, + layout: .vertical, + showDividerBefore: true + )) + } + + if let items = grouped[.management]?.map({ $0.1 }), !items.isEmpty { + sections.append(ObjectMenuSection( + items: items.sorted { $0.order < $1.order }, + layout: .vertical, + showDividerBefore: true + )) + } + + if let items = grouped[.finalActions]?.map({ $0.1 }), !items.isEmpty { + sections.append(ObjectMenuSection( + items: items.sorted { $0.order < $1.order }, + layout: .vertical, + showDividerBefore: true + )) + } + + return ObjectMenuConfiguration(sections: sections) + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuContainer.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuContainer.swift new file mode 100644 index 0000000000..3b7acb8ce7 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuContainer.swift @@ -0,0 +1,33 @@ +import SwiftUI +import AnytypeCore + +struct ObjectSettingsMenuContainer: View { + + @StateObject private var model: ObjectSettingsCoordinatorViewModel + + init(objectId: String, spaceId: String, output: (any ObjectSettingsCoordinatorOutput)?) { + self._model = StateObject(wrappedValue: ObjectSettingsCoordinatorViewModel(objectId: objectId, spaceId: spaceId, output: output)) + } + + var body: some View { + ObjectSettingsMenuView(objectId: model.objectId, spaceId: model.spaceId, output: model) + .sheet(item: $model.coverPickerData) { + ObjectCoverPicker(data: $0) + } + .sheet(item: $model.objectIconPickerData) { + ObjectIconPicker(data: $0) + } + .sheet(item: $model.blockObjectSearchData) { + BlockObjectSearchView(data: $0) + } + .sheet(item: $model.relationsListData) { + PropertiesListCoordinatorView(document: $0.document, output: model) + } + .sheet(item: $model.versionHistoryData) { + VersionHistoryCoordinatorView(data: $0, output: model) + } + .sheet(item: $model.publishingData) { + PublishToWebCoordinator(data: $0) + } + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuView.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuView.swift new file mode 100644 index 0000000000..febf22d49b --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuView.swift @@ -0,0 +1,95 @@ +import SwiftUI +import AnytypeCore + +struct ObjectSettingsMenuView: View { + + @State private var viewModel: ObjectSettingsMenuViewModel + + init( + objectId: String, + spaceId: String, + output: some ObjectSettingsModelOutput + ) { + let settingsVM = ObjectSettingsViewModel(objectId: objectId, spaceId: spaceId, output: output) + let actionsVM = ObjectActionsViewModel(objectId: objectId, spaceId: spaceId, output: settingsVM) + self._viewModel = State(wrappedValue: ObjectSettingsMenuViewModel(settingsViewModel: settingsVM, actionsViewModel: actionsVM)) + } + + var body: some View { + Menu { + ForEach(viewModel.menuConfig.sections) { section in + if section.showDividerBefore { + Divider() + } + renderSection(section) + } + } label: { + Image(asset: .X24.more) + .foregroundColor(.Text.primary) + } + .task { + await viewModel.startTasks() + } + .anytypeSheet(isPresented: viewModel.showConflictAlert) { + ObjectSettingsResolveConflictAlert { + try await viewModel.onTapResolveConflictApprove() + } + } + .snackbar(toastBarData: viewModel.toastData) + } + + @ViewBuilder + private func renderSection(_ section: ObjectMenuSection) -> some View { + if section.layout == .horizontal { + ControlGroup { + ForEach(section.items) { item in + renderMenuItem(item) + } + } + .controlGroupStyle(.menu) + } else { + ForEach(section.items) { item in + renderMenuItem(item) + } + } + } + + @ViewBuilder + private func renderMenuItem(_ item: ObjectMenuItem) -> some View { + switch item { + case .setting(let setting): + Button { + Task { + await viewModel.handleSetting(setting) + } + } label: { + Label { + Text(setting.title) + } icon: { + Image(asset: setting.imageAsset) + .renderingMode(.template) + .foregroundColor(.Text.primary) + } + } + case .action(let action): + Button(role: viewModel.isDestructiveAction(action) ? .destructive : nil) { + Task { + await viewModel.handleAction(action) + } + } label: { + Label { + Text(action.title) + } icon: { + if viewModel.isDestructiveAction(action) { + Image(asset: action.imageAsset) + } else { + Image(asset: action.imageAsset) + .renderingMode(.template) + .foregroundColor(.Text.primary) + } + } + } + } + } + +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuViewModel.swift new file mode 100644 index 0000000000..f70385b4dd --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/ObjectSettingsMenu/ObjectSettingsMenuViewModel.swift @@ -0,0 +1,131 @@ +import Foundation +import SwiftUI + +@MainActor +@Observable +final class ObjectSettingsMenuViewModel { + + var menuConfig = ObjectMenuConfiguration(sections: []) + + @ObservationIgnored + let settingsViewModel: ObjectSettingsViewModel + @ObservationIgnored + let actionsViewModel: ObjectActionsViewModel + + var showConflictAlert: Binding { + Binding( + get: { self.settingsViewModel.showConflictAlert }, + set: { self.settingsViewModel.showConflictAlert = $0 } + ) + } + + var toastData: Binding { + Binding( + get: { self.actionsViewModel.toastData }, + set: { self.actionsViewModel.toastData = $0 } + ) + } + + init(settingsViewModel: ObjectSettingsViewModel, actionsViewModel: ObjectActionsViewModel) { + self.settingsViewModel = settingsViewModel + self.actionsViewModel = actionsViewModel + setupSubscriptions() + } + + func startTasks() async { + async let settingsTask: () = settingsViewModel.startDocumentTask() + async let actionsTask: () = actionsViewModel.startSubscriptions() + _ = await (settingsTask, actionsTask) + } + + func onTapResolveConflictApprove() async throws { + try await settingsViewModel.onTapResolveConflictApprove() + } + + private func setupSubscriptions() { + observeSettings() + observeActions() + } + + private func observeSettings() { + withObservationTracking { + _ = settingsViewModel.settings + } onChange: { [weak self] in + Task { @MainActor [weak self] in + self?.rebuildMenu() + self?.observeSettings() + } + } + } + + private func observeActions() { + withObservationTracking { + _ = actionsViewModel.objectActions + } onChange: { [weak self] in + Task { @MainActor [weak self] in + self?.rebuildMenu() + self?.observeActions() + } + } + } + + private func rebuildMenu() { + menuConfig = ObjectMenuBuilder.buildMenu( + settings: settingsViewModel.settings, + actions: actionsViewModel.objectActions + ) + } + + func isDestructiveAction(_ action: ObjectAction) -> Bool { + switch action { + case .delete, .archive: + return true + default: + return false + } + } + + func handleSetting(_ setting: ObjectSetting) async { + switch setting { + case .icon: + settingsViewModel.onTapIconPicker() + case .cover: + settingsViewModel.onTapCoverPicker() + case .description: + try? await settingsViewModel.onTapDescription() + case .relations: + settingsViewModel.onTapRelations() + case .history: + settingsViewModel.onTapHistory() + case .resolveConflict: + settingsViewModel.onTapResolveConflict() + case .webPublishing: + settingsViewModel.onTapPublishing() + } + } + + func handleAction(_ action: ObjectAction) async { + switch action { + case .archive: + try? await actionsViewModel.changeArchiveState() + case let .pin(pinned): + try? await actionsViewModel.changePinState(pinned) + case .locked: + try? await actionsViewModel.changeLockState() + case .undoRedo: + actionsViewModel.undoRedoAction() + case .duplicate: + try? await actionsViewModel.duplicateAction() + case .linkItself: + actionsViewModel.linkItselfAction() + case .makeAsTemplate: + try? await actionsViewModel.makeAsTemplate() + case .templateToggleDefaultState: + try? await actionsViewModel.templateToggleDefaultState() + case .delete: + try? await actionsViewModel.deleteAction() + case .copyLink: + try? await actionsViewModel.copyLinkAction() + } + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Coordinator/PropertiesListCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Coordinator/PropertiesListCoordinatorViewModel.swift index 81b3789589..9f76269347 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Coordinator/PropertiesListCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Coordinator/PropertiesListCoordinatorViewModel.swift @@ -70,7 +70,7 @@ final class PropertiesListCoordinatorViewModel: showTypePicker = false Task { try await objectActionsService.setObjectType(objectId: document.objectId, typeUniqueKey: type.uniqueKey) - AnytypeAnalytics.instance().logChangeObjectType(type.analyticsType, spaceId: document.spaceId, route: .relationsList) + AnytypeAnalytics.instance().logChangeObjectType(type.analyticsType, route: .relationsList) } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/ObjectFieldsView/ObjectPropertiesViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/ObjectFieldsView/ObjectPropertiesViewModel.swift index 68597b8148..96f5608915 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/ObjectFieldsView/ObjectPropertiesViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/ObjectFieldsView/ObjectPropertiesViewModel.swift @@ -57,7 +57,7 @@ final class ObjectPropertiesViewModel: ObservableObject { Task { try await propertiesService.removeProperty(objectId: document.objectId, propertyKey: relation.key) let relationDetails = try propertyDetailsStorage.relationsDetails(key: relation.key, spaceId: document.spaceId) - AnytypeAnalytics.instance().logDeleteRelation(spaceId: document.spaceId, format: relationDetails.format, key: relationDetails.analyticsKey, route: .object) + AnytypeAnalytics.instance().logDeleteRelation(format: relationDetails.format, key: relationDetails.analyticsKey, route: .object) } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/TypePropertiesView/TypePropertiesViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/TypePropertiesView/TypePropertiesViewModel.swift index e331485a15..89048b8100 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/TypePropertiesView/TypePropertiesViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/EditorPage/Views/Settings/Properties/Views/TypePropertiesView/TypePropertiesViewModel.swift @@ -110,7 +110,7 @@ final class TypePropertiesViewModel: ObservableObject { target: .type(typeData), onRelationSelect: { [spaceId = document.spaceId] details, isNew in AnytypeAnalytics.instance().logAddExistingOrCreateRelation( - format: details.format, isNew: isNew, type: .type, key: details.analyticsKey, spaceId: spaceId + format: details.format, isNew: isNew, type: .type, key: details.analyticsKey ) } ) @@ -131,7 +131,7 @@ final class TypePropertiesViewModel: ObservableObject { anytypeAssertionFailure("Empty relation format for onRelationRemove") return } - AnytypeAnalytics.instance().logDeleteRelation(spaceId: document.spaceId, format: format, route: .type) + AnytypeAnalytics.instance().logDeleteRelation(format: format, route: .type) } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouter.swift b/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouter.swift index 360012bcc5..71a61feaf3 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouter.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouter.swift @@ -365,7 +365,7 @@ final class EditorRouter: NSObject, EditorRouterProtocol, ObjectSettingsCoordina func showTemplatesPicker() { templatesCoordinator.showTemplatesPicker( document: document, - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.didTapUseTemplateAsDefault(templateId: templateId) } ) @@ -440,7 +440,7 @@ extension EditorRouter { setObjectCreationSettingsCoordinator.showTemplateEditing( setting: setting, onTemplateSelection: nil, - onSetAsDefaultTempalte: { [weak self] templateId in + onSetAsDefaultTemplate: { [weak self] templateId in self?.didTapUseTemplateAsDefault(templateId: templateId) }, completion: { [weak self] in diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouterProtocol.swift b/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouterProtocol.swift index f955d8983d..7332fa73bf 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouterProtocol.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Routing/Editor/EditorRouterProtocol.swift @@ -6,7 +6,8 @@ import UIKit @MainActor protocol EditorRouterProtocol: AnyObject, - ObjectHeaderRouterProtocol + ObjectHeaderRouterProtocol, + ObjectSettingsCoordinatorOutput { func showAlert(alertModel: AlertModel) func showObject(objectId: String, forceOpenObject: Bool) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/EditorSetViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/EditorSetViewModel.swift index f67af832d2..b685f189f6 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/EditorSetViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/EditorSetViewModel.swift @@ -32,6 +32,7 @@ final class EditorSetViewModel: ObservableObject { @MainActor lazy var headerSettingsViewModel = SetHeaderSettingsViewModel( setDocument: setDocument, + output: output as? ObjectSettingsCoordinatorOutput, onViewTap: { [weak self] in self?.showViewPicker() }, onSettingsTap: { [weak self] in self?.showSetSettings() } , onCreateTap: { [weak self] in self?.createObject() }, @@ -212,12 +213,16 @@ final class EditorSetViewModel: ObservableObject { private var setGroupSubscriptionDataBuilder: any SetGroupSubscriptionDataBuilderProtocol @Injected(\.propertyDetailsStorage) private var propertyDetailsStorage: any PropertyDetailsStorageProtocol + @Injected(\.chatMessagesPreviewsStorage) + private var chatMessagesPreviewsStorage: any ChatMessagesPreviewsStorageProtocol private let documentsProvider: any DocumentsProviderProtocol = Container.shared.documentsProvider() private var subscriptions = [AnyCancellable]() private var subscriptionStorages = [String: any SubscriptionStorageProtocol]() private var titleSubscription: AnyCancellable? private var descriptionSubscription: AnyCancellable? + private var chatPreviews: [ChatMessagePreview] = [] + private let spaceView: SpaceView? private weak var output: (any EditorSetModuleOutput)? init(data: EditorListObject, showHeader: Bool, output: (any EditorSetModuleOutput)?) { @@ -242,6 +247,10 @@ final class EditorSetViewModel: ObservableObject { self.showHeader = showHeader self.output = output + + let spaceViewsStorage = Container.shared.spaceViewsStorage() + self.spaceView = spaceViewsStorage.spaceView(spaceId: data.spaceId) + self.setup() } @@ -282,13 +291,13 @@ final class EditorSetViewModel: ObservableObject { func logModuleScreen() { if let details = setDocument.details, details.isObjectType { - AnytypeAnalytics.instance().logScreenType(objectType: details.analyticsType, spaceId: setDocument.spaceId) + AnytypeAnalytics.instance().logScreenType(objectType: details.analyticsType) } else if setDocument.isCollection() { let viewType = activeView.type.analyticStringValue - AnytypeAnalytics.instance().logScreenCollection(with: viewType, spaceId: setDocument.spaceId) + AnytypeAnalytics.instance().logScreenCollection(with: viewType) } else { let viewType = activeView.type.analyticStringValue - AnytypeAnalytics.instance().logScreenSet(with: viewType, spaceId: setDocument.spaceId) + AnytypeAnalytics.instance().logScreenSet(with: viewType) } } @@ -317,8 +326,9 @@ final class EditorSetViewModel: ObservableObject { func startSubscriptions() async { async let templatesSub: () = subscribeOnTemplates() async let relationsSub: () = subscribeOnRelations() - - (_, _) = await (templatesSub, relationsSub) + async let chatPreviewsSub: () = startChatPreviewsSequence() + + (_, _, _) = await (templatesSub, relationsSub, chatPreviewsSub) } private func subscribeOnTemplates() async { @@ -339,6 +349,13 @@ final class EditorSetViewModel: ObservableObject { self.relationsCount = properties.installed.count + conflictingRelations.count } } + + private func startChatPreviewsSequence() async { + for await previews in await chatMessagesPreviewsStorage.previewsSequence { + chatPreviews = previews + updateConfigurations(with: Array(recordsDict.keys)) + } + } func startSubscriptionIfNeeded(forceUpdate: Bool = false) async { @@ -549,7 +566,7 @@ final class EditorSetViewModel: ObservableObject { } guard setDocument.canStartSubscription() else { return } - + let data = setSubscriptionDataBuilder.set( SetSubscriptionData( identifier: subscriptionId, @@ -558,7 +575,8 @@ final class EditorSetViewModel: ObservableObject { currentPage: currentPage, // show first page for empty request numberOfRowsPerPage: numberOfRowsPerPage, collectionId: setDocument.isCollection() ? objectId : nil, - objectOrderIds: setDocument.objectOrderIds(for: subscriptionId) + objectOrderIds: setDocument.objectOrderIds(for: subscriptionId), + spaceUxType: spaceView?.uxType ) ) @@ -593,10 +611,12 @@ final class EditorSetViewModel: ObservableObject { records, dataView: setDocument.dataView, activeView: activeView, - viewRelationValueIsLocked: !setDocument.setPermissions.canEditRelationValuesInView, + viewRelationValueIsLocked: !setDocument.setPermissions.canEditRelationValuesInView, canEditIcon: setDocument.setPermissions.canEditSetObjectIcon, storage: subscription.detailsStorage, spaceId: setDocument.spaceId, + chatPreviews: chatPreviews, + spaceView: spaceView, onItemTap: { [weak self] details in self?.itemTapped(details) } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Models/SetDocument.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Models/SetDocument.swift index d402c5917f..0a40e6769f 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Models/SetDocument.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Models/SetDocument.swift @@ -240,10 +240,14 @@ final class SetDocument: SetDocumentProtocol, @unchecked Sendable { } .store(in: &subscriptions) - accountParticipantsStorage.canEditPublisher(spaceId: spaceId).receiveOnMain().sink { [weak self] canEdit in - self?.participantIsEditor = canEdit - self?.updateData() - }.store(in: &subscriptions) + Task { @MainActor [weak self, accountParticipantsStorage, spaceId] in + for await canEdit in accountParticipantsStorage.canEditSequence(spaceId: spaceId) { + self?.participantIsEditor = canEdit + self?.updateData() + } + } + .cancellable() + .store(in: &subscriptions) } private func updateData() { diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Group/SetGroupSubscriptionDataBuilder.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Group/SetGroupSubscriptionDataBuilder.swift index 0aa7796d7f..94ed01c28a 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Group/SetGroupSubscriptionDataBuilder.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Group/SetGroupSubscriptionDataBuilder.swift @@ -17,10 +17,12 @@ final class SetGroupSubscriptionDataBuilder: SetGroupSubscriptionDataBuilderProt nonisolated init() {} func groupsData(_ setDocument: some SetDocumentProtocol) -> GroupsSubscriptionData { - GroupsSubscriptionData( + var filters = setDocument.activeView.filters + filters.append(SearchHelper.filterOutParticipantType()) + return GroupsSubscriptionData( identifier: groupSubscriptionId, relationKey: setDocument.activeView.groupRelationKey, - filters: setDocument.activeView.filters, + filters: filters, source: setDocument.details?.filteredSetOf, collectionId: setDocument.isCollection() ? setDocument.objectId : nil ) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Set/SetSubscriptionData.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Set/SetSubscriptionData.swift index aa03dad2c3..ec54414a1b 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Set/SetSubscriptionData.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Subscriptions/Set/SetSubscriptionData.swift @@ -20,7 +20,8 @@ struct SetSubscriptionData: Hashable { currentPage: Int, numberOfRowsPerPage: Int, collectionId: String?, - objectOrderIds: [String] + objectOrderIds: [String], + spaceUxType: SpaceUxType? ) { self.identifier = identifier self.source = document.details?.filteredSetOf @@ -55,8 +56,9 @@ struct SetSubscriptionData: Hashable { if let groupFilter { filters.append(groupFilter) } - filters.append(SearchHelper.layoutFilter(DetailsLayout.visibleLayoutsWithFiles)) + filters.append(SearchHelper.layoutFilter(DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType))) filters.append(contentsOf: SearchHelper.notHiddenFilters()) + filters.append(SearchHelper.filterOutParticipantType()) self.filters = filters self.options = view.options self.currentPage = currentPage diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetChatPreviewView.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetChatPreviewView.swift new file mode 100644 index 0000000000..8d1524fe65 --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetChatPreviewView.swift @@ -0,0 +1,55 @@ +import SwiftUI + +struct SetChatPreviewView: View { + let configuration: SetContentViewItemConfiguration + let chatPreview: MessagePreviewModel + + var body: some View { + VStack(alignment: .leading, spacing: 4) { + HStack(spacing: 8) { + if configuration.showIcon { + IconView(icon: configuration.icon) + .frame(width: 32, height: 32) + } + + if configuration.showTitle { + AnytypeText(configuration.title, style: .previewTitle2Medium) + .foregroundColor(chatPreview.titleColor) + .lineLimit(1) + } + + Spacer() + + if chatPreview.hasCounters { + HStack(spacing: 4) { + if chatPreview.mentionCounter > 0 { + MentionBadge(style: chatPreview.mentionStyle) + } + if chatPreview.unreadCounter > 0 { + CounterView( + count: chatPreview.unreadCounter, + style: chatPreview.unreadStyle + ) + } + } + } + } + + HStack(spacing: 0) { + AnytypeText(chatPreview.messagePreviewText, style: .relation2Regular) + .foregroundColor(chatPreview.messagePreviewColor) + .lineLimit(2) + + Spacer() + } + + HStack(spacing: 0) { + AnytypeText(chatPreview.chatPreviewDate, style: .relation3Regular) + .foregroundColor(.Text.secondary) + .lineLimit(1) + + Spacer() + } + } + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetGalleryViewCell.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetGalleryViewCell.swift index 4f30e238a8..6856f437fa 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetGalleryViewCell.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetGalleryViewCell.swift @@ -31,15 +31,19 @@ struct SetGalleryViewCell: View { private var infoContent: some View { VStack(alignment: .leading, spacing: 4) { - TitleWithIconView( - icon: configuration.icon, - showIcon: configuration.showIcon, - canEditIcon: configuration.canEditIcon, - title: configuration.title, - showTitle: configuration.showTitle, - style: .gallery - ) - relations + if let chatPreview = configuration.chatPreview { + SetChatPreviewView(configuration: configuration, chatPreview: chatPreview) + } else { + TitleWithIconView( + icon: configuration.icon, + showIcon: configuration.showIcon, + canEditIcon: configuration.canEditIcon, + title: configuration.title, + showTitle: configuration.showTitle, + style: .gallery + ) + relations + } } .padding(.top, configuration.hasCover && configuration.coverType.isNotNil ? 0 : Constants.contentPadding ) .padding([.leading, .trailing, .bottom], Constants.contentPadding) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListChatPreviewView.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListChatPreviewView.swift new file mode 100644 index 0000000000..367497ed4e --- /dev/null +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListChatPreviewView.swift @@ -0,0 +1,61 @@ +import SwiftUI + +struct SetListChatPreviewView: View { + let configuration: SetContentViewItemConfiguration + let chatPreview: MessagePreviewModel + + var body: some View { + HStack(spacing: 0) { + if configuration.showIcon { + IconView(icon: configuration.icon) + .frame(width: 48, height: 48) + Spacer.fixedWidth(12) + } + + VStack(alignment: .leading, spacing: 1) { + HStack(spacing: 0) { + if configuration.showTitle { + AnytypeText(configuration.title, style: .previewTitle2Medium) + .foregroundColor(chatPreview.titleColor) + .lineLimit(1) + } + + Spacer() + + AnytypeText(chatPreview.chatPreviewDate, style: .relation3Regular) + .foregroundColor(.Text.secondary) + .lineLimit(1) + } + + HStack(spacing: 0) { + AnytypeText(chatPreview.messagePreviewText, style: .relation2Regular) + .foregroundColor(chatPreview.messagePreviewColor) + .lineLimit(1) + + Spacer() + + if chatPreview.hasCounters { + HStack(spacing: 4) { + if chatPreview.mentionCounter > 0 { + MentionBadge(style: chatPreview.mentionStyle) + } + if chatPreview.unreadCounter > 0 { + CounterView( + count: chatPreview.unreadCounter, + style: chatPreview.unreadStyle + ) + } + } + } + } + } + + Spacer() + } + .background(Color.Background.primary) + .frame(maxWidth: .infinity, alignment: .topLeading) + .padding(.vertical, 20) + .clipped() + .fixTappableArea() + } +} diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListViewCell.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListViewCell.swift index 55c1a35fde..fbd106086e 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListViewCell.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Collection/Cell/SetListViewCell.swift @@ -12,12 +12,21 @@ struct SetListViewCell: View { } .buttonStyle(LightDimmingButtonStyle()) } - + + @ViewBuilder private var content: some View { + if let chatPreview = configuration.chatPreview { + SetListChatPreviewView(configuration: configuration, chatPreview: chatPreview) + } else { + regularContent + } + } + + private var regularContent: some View { FlowPropertiesView( viewModel: FlowPropertiesViewModel( icon: configuration.icon, - showIcon: configuration.showIcon, + showIcon: configuration.showIcon, canEditIcon: configuration.canEditIcon, title: configuration.title, description: configuration.description, diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsView.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsView.swift index fcb1ed3895..0794704dac 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsView.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsView.swift @@ -1,4 +1,5 @@ import SwiftUI +import AnytypeCore struct SetHeaderSettingsView: View { @@ -51,7 +52,7 @@ struct SetHeaderSettingsView: View { Rectangle() .fill(Color.clear) .frame(width: 1, height: 28) - .background(Color.Additional.separator) + .background(model.isActiveCreateButton ? Color.Control.accent80 : Color.Shape.transperentSecondary) StandardButton(.image(.X18.listArrow), style: .primaryXSmall, corners: [.topRight, .bottomRight]) { UISelectionFeedbackGenerator().selectionChanged() model.onSecondaryCreateTap() @@ -86,7 +87,7 @@ struct SetHeaderSettings_Previews: PreviewProvider { static var previews: some View { SetHeaderSettingsView( model: SetHeaderSettingsViewModel( - setDocument: Container.shared.documentsProvider().setDocument(objectId: "", spaceId: ""), + setDocument: Container.shared.documentsProvider().setDocument(objectId: "", spaceId: ""), output: nil, onViewTap: {}, onSettingsTap: {}, onCreateTap:{}, diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsViewModel.swift index 189a153b7e..545e79d5bb 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetHeaderSettingsViewModel.swift @@ -7,7 +7,8 @@ class SetHeaderSettingsViewModel: ObservableObject { @Published var isActiveCreateButton = true @Published var isActiveHeader = true @Published var showUnsupportedBanner = false - private let setDocument: any SetDocumentProtocol + let setDocument: any SetDocumentProtocol + let output: (any ObjectSettingsCoordinatorOutput)? private var subscriptions = [AnyCancellable]() let onViewTap: () -> Void @@ -19,12 +20,14 @@ class SetHeaderSettingsViewModel: ObservableObject { init( setDocument: some SetDocumentProtocol, + output: (any ObjectSettingsCoordinatorOutput)?, onViewTap: @escaping () -> Void, onSettingsTap: @escaping () -> Void, onCreateTap: @escaping () -> Void, onSecondaryCreateTap: @escaping () -> Void ) { self.setDocument = setDocument + self.output = output self.onViewTap = onViewTap self.onSettingsTap = onSettingsTap self.onCreateTap = onCreateTap diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetMinimizedHeader.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetMinimizedHeader.swift index 251c15e9a2..ae08b6655c 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetMinimizedHeader.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Header/SetMinimizedHeader.swift @@ -69,7 +69,25 @@ struct SetMinimizedHeader: View { .frame(width: 28, height: 28) } + @ViewBuilder private var settingsButton: some View { + if FeatureFlags.newObjectSettings { + settingsMenuButton + } else { + settingsActionButton + } + } + + private var settingsMenuButton: some View { + ObjectSettingsMenuContainer( + objectId: model.setDocument.objectId, + spaceId: model.setDocument.spaceId, + output: model.headerSettingsViewModel.output + ) + .frame(width: 44, height: 44) + } + + private var settingsActionButton: some View { EditorBarButtonItem( imageAsset: .X24.more, state: EditorBarItemState( diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Models/SetContentViewDataBuilder.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Models/SetContentViewDataBuilder.swift index 4ecc3f0209..2e46887a2d 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Models/SetContentViewDataBuilder.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Models/SetContentViewDataBuilder.swift @@ -19,6 +19,8 @@ protocol SetContentViewDataBuilderProtocol: AnyObject { canEditIcon: Bool, storage: ObjectDetailsStorage, spaceId: String, + chatPreviews: [ChatMessagePreview], + spaceView: SpaceView?, onItemTap: @escaping @MainActor (ObjectDetails) -> Void ) -> [SetContentViewItemConfiguration] } @@ -29,6 +31,8 @@ final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { private var relationsBuilder: any PropertiesBuilderProtocol @Injected(\.propertyDetailsStorage) private var propertyDetailsStorage: any PropertyDetailsStorageProtocol + + private let dateFormatter = ChatPreviewDateFormatter() func sortedRelations(dataview: BlockDataview, view: DataviewView, spaceId: String) -> [SetProperty] { let storageRelationsDetails = propertyDetailsStorage.relationsDetails(keys: dataview.relationLinks.map(\.key), spaceId: spaceId) @@ -93,6 +97,8 @@ final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { canEditIcon: Bool, storage: ObjectDetailsStorage, spaceId: String, + chatPreviews: [ChatMessagePreview], + spaceView: SpaceView?, onItemTap: @escaping @MainActor (ObjectDetails) -> Void ) -> [SetContentViewItemConfiguration] { @@ -119,14 +125,21 @@ final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { let minHeight = calculateMinHeight(activeView: activeView, items: items, showTitle: showTitle, showIcon: showIcon) let hasCover = activeView.coverRelationKey.isNotEmpty && activeView.type != .kanban - + + let chatPreviewsDict = Dictionary(uniqueKeysWithValues: chatPreviews.map { ($0.chatId, $0) }) + return items.map { item in + let chatPreview = buildChatPreview( + objectId: item.details.id, + spaceView: spaceView, + chatPreviewsDict: chatPreviewsDict + ) return SetContentViewItemConfiguration( id: item.details.id, title: item.details.pluralTitle, showTitle: showTitle, description: item.details.description, - icon: item.details.objectIconImage, + icon: item.details.objectIconImage, canEditIcon: canEditIcon, relations: item.relations, showIcon: showIcon, @@ -135,6 +148,7 @@ final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { coverFit: activeView.coverFit, coverType: coverType(item.details, dataView: dataView, activeView: activeView, spaceId: spaceId, detailsStorage: storage), minHeight: minHeight, + chatPreview: chatPreview, onItemTap: { [details = item.details] in onItemTap(details) } @@ -270,4 +284,36 @@ final class SetContentViewDataBuilder: SetContentViewDataBuilderProtocol { return maxHeight } + + func buildChatPreview( + objectId: String, + spaceView: SpaceView?, + chatPreviewsDict: [String: ChatMessagePreview] + ) -> MessagePreviewModel? { + guard let preview = chatPreviewsDict[objectId], + let lastMessage = preview.lastMessage else { + return nil + } + + let attachments = lastMessage.attachments.prefix(3).map { objectDetails in + MessagePreviewModel.Attachment( + id: objectDetails.id, + icon: objectDetails.objectIconImage + ) + } + + let isMuted = !(spaceView?.effectiveNotificationMode(for: objectId).isUnmutedAll ?? true) + + return MessagePreviewModel( + creatorTitle: lastMessage.creator?.title, + text: lastMessage.text, + attachments: Array(attachments), + localizedAttachmentsText: lastMessage.localizedAttachmentsText, + chatPreviewDate: dateFormatter.localizedDateString(for: lastMessage.createdAt, showTodayTime: true), + unreadCounter: preview.unreadCounter, + mentionCounter: preview.mentionCounter, + isMuted: isMuted, + chatName: nil + ) + } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/Coordinator/SetPropertiesCoordinatorViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/Coordinator/SetPropertiesCoordinatorViewModel.swift index 654cc66b93..8c44d6ae01 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/Coordinator/SetPropertiesCoordinatorViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/Coordinator/SetPropertiesCoordinatorViewModel.swift @@ -44,8 +44,7 @@ final class SetPropertiesCoordinatorViewModel: format: relationDetails.format, isNew: isNew, type: .dataview, - key: relationDetails.analyticsKey, - spaceId: setDocument.spaceId + key: relationDetails.analyticsKey ) } ) diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/SetPropertiesViewModel.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/SetPropertiesViewModel.swift index ef5b578d80..f4513374bf 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/SetPropertiesViewModel.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Popups/RelationsSettings/SetPropertiesViewModel.swift @@ -111,8 +111,7 @@ final class SetPropertiesViewModel: ObservableObject { format: relation.format, isNew: isNew, type: .dataview, - key: relation.analyticsKey, - spaceId: spaceId + key: relation.analyticsKey ) } } diff --git a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Table/Row/SetContentViewItemConfiguration.swift b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Table/Row/SetContentViewItemConfiguration.swift index de66238948..ab0ee99789 100644 --- a/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Table/Row/SetContentViewItemConfiguration.swift +++ b/Anytype/Sources/PresentationLayer/TextEditor/Set/Views/Table/Row/SetContentViewItemConfiguration.swift @@ -16,6 +16,7 @@ struct SetContentViewItemConfiguration: Identifiable, Hashable { let coverFit: Bool let coverType: ObjectHeaderCoverType? let minHeight: CGFloat? + let chatPreview: MessagePreviewModel? @EquatableNoop var onItemTap: @MainActor () -> Void init( @@ -32,6 +33,7 @@ struct SetContentViewItemConfiguration: Identifiable, Hashable { coverFit: Bool, coverType: ObjectHeaderCoverType?, minHeight: CGFloat?, + chatPreview: MessagePreviewModel? = nil, onItemTap: @escaping @MainActor () -> Void ) { self.id = id @@ -47,6 +49,7 @@ struct SetContentViewItemConfiguration: Identifiable, Hashable { self.coverFit = coverFit self.coverType = coverType self.minHeight = minHeight + self.chatPreview = chatPreview self.onItemTap = onItemTap } } diff --git a/Anytype/Sources/PreviewMocks/Mocks/Models/SpaceViewMock.swift b/Anytype/Sources/PreviewMocks/Mocks/Models/SpaceViewMock.swift index a6d7d3ed3d..0ba09f1f83 100644 --- a/Anytype/Sources/PreviewMocks/Mocks/Models/SpaceViewMock.swift +++ b/Anytype/Sources/PreviewMocks/Mocks/Models/SpaceViewMock.swift @@ -28,7 +28,10 @@ extension SpaceView { spaceOrder: "", uxType: .allCases.randomElement()!, pushNotificationEncryptionKey: "", - pushNotificationMode: .allCases.randomElement()! + pushNotificationMode: .allCases.randomElement()!, + forceAllIds: [], + forceMuteIds: [], + forceMentionIds: [] ) } } diff --git a/Anytype/Sources/PreviewMocks/Mocks/Services/SyncStatusStorageMock.swift b/Anytype/Sources/PreviewMocks/Mocks/Services/SyncStatusStorageMock.swift index c1e864b0bc..f6cfd3244a 100644 --- a/Anytype/Sources/PreviewMocks/Mocks/Services/SyncStatusStorageMock.swift +++ b/Anytype/Sources/PreviewMocks/Mocks/Services/SyncStatusStorageMock.swift @@ -7,9 +7,9 @@ final class SyncStatusStorageMock: SyncStatusStorageProtocol, @unchecked Sendabl static let shared = SyncStatusStorageMock() @Published private var publishedInfo: SpaceSyncStatusInfo = .default(spaceId: "") - var infoToReturn = Services.SpaceSyncStatusInfo.mockArray() + var infoToReturn = SpaceSyncStatusInfo.mockArray() - func statusPublisher(spaceId: String) -> AnyPublisher { + func statusPublisher(spaceId: String) -> AnyPublisher { Task.detached { [infoToReturn] in while true { for info in infoToReturn { @@ -22,17 +22,23 @@ final class SyncStatusStorageMock: SyncStatusStorageProtocol, @unchecked Sendabl return $publishedInfo.eraseToAnyPublisher() } - func startSubscription() { - fatalError() + func allSpacesStatusPublisher() -> AnyPublisher<[SpaceSyncStatusInfo], Never> { + return $publishedInfo + .map { [$0] } + .eraseToAnyPublisher() } - func stopSubscriptionAndClean() { - fatalError() + func startSubscription() async { + // Mock implementation - no-op + } + + func stopSubscriptionAndClean() async { + // Mock implementation - no-op } } extension SpaceSyncStatusInfo { - static func mockArray(network: Anytype_Event.Space.Network = .anytype) -> [Services.SpaceSyncStatusInfo] { + static func mockArray(network: Anytype_Event.Space.Network = .anytype) -> [SpaceSyncStatusInfo] { [ .mock(network: network, status: .offline), .mock(network: network, status: .syncing), @@ -44,8 +50,8 @@ extension SpaceSyncStatusInfo { static func mock( network: Anytype_Event.Space.Network = .anytype, status: Anytype_Event.Space.Status = .offline - ) -> Services.SpaceSyncStatusInfo { - var mock = Services.SpaceSyncStatusInfo.init() + ) -> SpaceSyncStatusInfo { + var mock = SpaceSyncStatusInfo.init() mock.id = "1337" mock.status = status mock.error = .incompatibleVersion diff --git a/Anytype/Sources/ServiceLayer/AIConfigBuilder/AIConfigBuilder.swift b/Anytype/Sources/ServiceLayer/AIConfigBuilder/AIConfigBuilder.swift deleted file mode 100644 index 1a3923d880..0000000000 --- a/Anytype/Sources/ServiceLayer/AIConfigBuilder/AIConfigBuilder.swift +++ /dev/null @@ -1,37 +0,0 @@ -import Foundation -import Services - -protocol AIConfigBuilderProtocol: Sendable { - func makeOpenAIConfig() -> AIProviderConfig? -} - -struct AIConfigBuilder: AIConfigBuilderProtocol { - private var endpoint: String? { - Bundle.main.object(forInfoDictionaryKey: "AIEndpoint") as? String - } - - private var model: String? { - Bundle.main.object(forInfoDictionaryKey: "AIModel") as? String - } - - private var token: String? { - Bundle.main.object(forInfoDictionaryKey: "OpenAIToken") as? String - } - - func makeOpenAIConfig() -> AIProviderConfig? { - guard let endpoint, endpoint.isNotEmpty, - let model, model.isNotEmpty, - let token, token.isNotEmpty else { - return nil - } - - var config = AIProviderConfig() - config.provider = .openai - config.endpoint = endpoint - config.model = model - config.token = token - config.temperature = 0.2 - - return config - } -} diff --git a/Anytype/Sources/ServiceLayer/AccountParticipantsStorage/AcountParticipantSubscriptionBuilder.swift b/Anytype/Sources/ServiceLayer/AccountParticipantsStorage/AcountParticipantSubscriptionBuilder.swift index 787adb8b52..c8f620d3f2 100644 --- a/Anytype/Sources/ServiceLayer/AccountParticipantsStorage/AcountParticipantSubscriptionBuilder.swift +++ b/Anytype/Sources/ServiceLayer/AccountParticipantsStorage/AcountParticipantSubscriptionBuilder.swift @@ -2,21 +2,19 @@ import Foundation import Services -final class AcountParticipantSubscriptionBuilder: MultispaceSubscriptionDataBuilderProtocol { +final class AcountParticipantSubscriptionBuilder { - func build(accountId: String, spaceId: String, subId: String) -> SubscriptionData { + func build(accountId: String, subId: String) -> SubscriptionData { let filters: [DataviewFilter] = .builder { SearchHelper.identity(accountId) SearchHelper.layoutFilter([.participant]) } - let searchData: SubscriptionData = .search( - SubscriptionData.Search( + let searchData: SubscriptionData = .crossSpaceSearch( + SubscriptionData.CrossSpaceSearch( identifier: subId, - spaceId: spaceId, filters: filters, - limit: 0, keys: Participant.subscriptionKeys.map { $0.rawValue }, noDepSubscription: true ) diff --git a/Anytype/Sources/ServiceLayer/Auth/LoginStateService.swift b/Anytype/Sources/ServiceLayer/Auth/LoginStateService.swift index b90307434f..1a92eb83a1 100644 --- a/Anytype/Sources/ServiceLayer/Auth/LoginStateService.swift +++ b/Anytype/Sources/ServiceLayer/Auth/LoginStateService.swift @@ -30,6 +30,7 @@ final class LoginStateService: LoginStateServiceProtocol, Sendable { private let membershipStatusStorage: any MembershipStatusStorageProtocol = Container.shared.membershipStatusStorage() private let propertyDetailsStorage: any PropertyDetailsStorageProtocol = Container.shared.propertyDetailsStorage() private let workspacesStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() + private let chatDetailsStorage: any ChatDetailsStorageProtocol = Container.shared.chatDetailsStorage() private let accountParticipantsStorage: any ParticipantsStorageProtocol = Container.shared.participantsStorage() private let participantSpacesStorage: any ParticipantSpacesStorageProtocol = Container.shared.participantSpacesStorage() private let storeKitService: any StoreKitServiceProtocol = Container.shared.storeKitService() @@ -85,6 +86,7 @@ final class LoginStateService: LoginStateServiceProtocol, Sendable { private func startSubscriptions() async { await workspacesStorage.startSubscription() + await chatDetailsStorage.startSubscription() await accountParticipantsStorage.startSubscription() await participantSpacesStorage.startSubscription() await networkConnectionStatusDaemon.start() @@ -94,16 +96,13 @@ final class LoginStateService: LoginStateServiceProtocol, Sendable { await spaceIconForNotificationsHandler.startUpdating() Task { - // Time-heavy operation - #if RELEASE_ANYAPP - await storeKitService.activatePromoTier() - #endif await membershipStatusStorage.startSubscription() } } private func stopSubscriptions() async { await workspacesStorage.stopSubscription() + await chatDetailsStorage.stopSubscription() await propertyDetailsStorage.stopSubscription() await objectTypeProvider.stopSubscription() await accountParticipantsStorage.stopSubscription() diff --git a/Anytype/Sources/ServiceLayer/Block/BlockActionHandler/BlockActionHandler.swift b/Anytype/Sources/ServiceLayer/Block/BlockActionHandler/BlockActionHandler.swift index 18a3bc1979..21a6d63bcc 100644 --- a/Anytype/Sources/ServiceLayer/Block/BlockActionHandler/BlockActionHandler.swift +++ b/Anytype/Sources/ServiceLayer/Block/BlockActionHandler/BlockActionHandler.swift @@ -100,7 +100,7 @@ final class BlockActionHandler: BlockActionHandlerProtocol, Sendable { } func duplicate(blockId: String) { - AnytypeAnalytics.instance().logDuplicateBlock(spaceId: document.spaceId) + AnytypeAnalytics.instance().logDuplicateBlock() service.duplicate(blockId: blockId) } @@ -148,7 +148,6 @@ final class BlockActionHandler: BlockActionHandlerProtocol, Sendable { Task { let isBookmarkType = targetDetails.resolvedLayoutValue == .bookmark AnytypeAnalytics.instance().logCreateLink( - spaceId: targetDetails.spaceId, objectType: targetDetails.objectType.analyticsType, route: route ) @@ -234,7 +233,7 @@ final class BlockActionHandler: BlockActionHandlerProtocol, Sendable { try await fileService.uploadDataAt(source: uploadingSource, contextID: document.objectId, blockID: blockId) } - AnytypeAnalytics.instance().logUploadMedia(type: type.asFileBlockContentType, spaceId: document.spaceId, route: route) + AnytypeAnalytics.instance().logUploadMedia(type: type.asFileBlockContentType, route: route) } func uploadImage(image: UIImage, type: String, blockId: String, route: UploadMediaRoute) { @@ -251,11 +250,11 @@ final class BlockActionHandler: BlockActionHandlerProtocol, Sendable { try await fileService.uploadDataAt(data: fileData, contextID: document.objectId, blockID: blockId) } - AnytypeAnalytics.instance().logUploadMedia(type: .image, spaceId: document.spaceId, route: route) + AnytypeAnalytics.instance().logUploadMedia(type: .image, route: route) } func uploadFileAt(localPath: String, blockId: String, route: UploadMediaRoute) { - AnytypeAnalytics.instance().logUploadMedia(type: .file, spaceId: document.spaceId, route: route) + AnytypeAnalytics.instance().logUploadMedia(type: .file, route: route) Task { await EventsBunch( diff --git a/Anytype/Sources/ServiceLayer/Block/Mention/MentionObjectsService.swift b/Anytype/Sources/ServiceLayer/Block/Mention/MentionObjectsService.swift index 0ff53c3461..04f5ce066b 100644 --- a/Anytype/Sources/ServiceLayer/Block/Mention/MentionObjectsService.swift +++ b/Anytype/Sources/ServiceLayer/Block/Mention/MentionObjectsService.swift @@ -7,22 +7,24 @@ protocol MentionObjectsServiceProtocol: AnyObject, Sendable { } final class MentionObjectsService: MentionObjectsServiceProtocol, Sendable { - + private let searchMiddleService: any SearchMiddleServiceProtocol = Container.shared.searchMiddleService() - + private let spaceViewsStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() + func searchMentions(spaceId: String, text: String, excludedObjectIds: [String], limitLayout: [DetailsLayout]) async throws -> [MentionObject] { let sort = SearchHelper.sort( relation: .lastOpenedDate, type: .desc ) - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: limitLayout) + SearchFiltersBuilder.build(isArchived: false, layouts: limitLayout, spaceUxType: spaceUxType) SearchHelper.excludedIdsFilter(excludedObjectIds) } - + let details = try await searchMiddleService.search(spaceId: spaceId, filters: filters, sorts: [sort], fullText: text) - + return details.map { MentionObject(details: $0) } } diff --git a/Anytype/Sources/ServiceLayer/Block/Pastboard/Operations/PasteboardTask.swift b/Anytype/Sources/ServiceLayer/Block/Pastboard/Operations/PasteboardTask.swift index a23dc7d12e..8d56c1eaf8 100644 --- a/Anytype/Sources/ServiceLayer/Block/Pastboard/Operations/PasteboardTask.swift +++ b/Anytype/Sources/ServiceLayer/Block/Pastboard/Operations/PasteboardTask.swift @@ -51,19 +51,19 @@ final class PasteboardTask: Sendable { // Find first item to paste with follow order anySlots (blocks slots), htmlSlot, textSlot, filesSlots // blocks slots if let blocksSlots = pasteboardHelper.obtainBlocksSlots() { - AnytypeAnalytics.instance().logPasteBlock(spaceId: spaceId, countBlocks: blocksSlots.count) + AnytypeAnalytics.instance().logPasteBlock(countBlocks: blocksSlots.count) return try await pasteboardMiddlewareService.pasteBlock(blocksSlots, objectId: objectId, context: context) } // html slot if let htmlSlot = pasteboardHelper.obtainHTMLSlot() { - AnytypeAnalytics.instance().logPasteBlock(spaceId: spaceId, countBlocks: 1) + AnytypeAnalytics.instance().logPasteBlock(countBlocks: 1) return try await pasteboardMiddlewareService.pasteHTML(htmlSlot, objectId: objectId, context: context) } // text slot if let textSlot = pasteboardHelper.obtainTextSlot() { - AnytypeAnalytics.instance().logPasteBlock(spaceId: spaceId, countBlocks: 1) + AnytypeAnalytics.instance().logPasteBlock(countBlocks: 1) return try await pasteboardMiddlewareService.pasteText(textSlot, objectId: objectId, context: context) } @@ -76,7 +76,7 @@ final class PasteboardTask: Sendable { } let fileSlots = pasteboardHelper.obtainFileSlots() - AnytypeAnalytics.instance().logPasteBlock(spaceId: spaceId, countBlocks: fileSlots.count) + AnytypeAnalytics.instance().logPasteBlock(countBlocks: fileSlots.count) for itemProvider in fileSlots { try Task.checkCancellation() diff --git a/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsStorage.swift b/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsStorage.swift new file mode 100644 index 0000000000..4517227fa0 --- /dev/null +++ b/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsStorage.swift @@ -0,0 +1,53 @@ +import Foundation +import Services +import AsyncTools +import AsyncAlgorithms + +protocol ChatDetailsStorageProtocol: AnyObject, Sendable { + func allChats() async -> [ObjectDetails] + var allChatsSequence: AnyAsyncSequence<[ObjectDetails]> { get async } + func startSubscription() async + func stopSubscription() async + func chat(id: String) async -> ObjectDetails? +} + +actor ChatDetailsStorage: ChatDetailsStorageProtocol { + + private let subscriptionBuilder: any ChatDetailsSubscriptionBuilderProtocol = Container.shared.chatDetailsSubscriptionBuilder() + private let subscriptionStorageProvider: any SubscriptionStorageProviderProtocol = Container.shared.subscriptionStorageProvider() + private let subscriptionStorage: any SubscriptionStorageProtocol + + private let allChatsStream = AsyncToManyStream<[ObjectDetails]>() + + func allChats() -> [ObjectDetails] { + allChatsStream.value ?? [] + } + + var allChatsSequence: AnyAsyncSequence<[ObjectDetails]> { + allChatsStream + .subscribe([]) + .throttle(milliseconds: 300, latest: true) + .removeDuplicates() + .eraseToAnyAsyncSequence() + } + + init() { + self.subscriptionStorage = subscriptionStorageProvider.createSubscriptionStorage(subId: subscriptionBuilder.subscriptionId) + } + + func startSubscription() async { + let data = subscriptionBuilder.build() + try? await subscriptionStorage.startOrUpdateSubscription(data: data) { [weak self] data in + guard let self else { return } + self.allChatsStream.send(data.items) + } + } + + func stopSubscription() async { + try? await subscriptionStorage.stopSubscription() + } + + func chat(id: String) -> ObjectDetails? { + return allChatsStream.value?.first(where: { $0.id == id }) + } +} diff --git a/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsSubscriptionBuilder.swift b/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsSubscriptionBuilder.swift new file mode 100644 index 0000000000..7463f3ef78 --- /dev/null +++ b/Anytype/Sources/ServiceLayer/ChatStorage/ChatDetailsSubscriptionBuilder.swift @@ -0,0 +1,49 @@ +import Foundation +import Services +import AnytypeCore + +protocol ChatDetailsSubscriptionBuilderProtocol: AnyObject, Sendable { + var subscriptionId: String { get } + func build() -> SubscriptionData +} + +final class ChatDetailsSubscriptionBuilder: ChatDetailsSubscriptionBuilderProtocol { + + private enum Constants { + static let chatsSubId = "SubscriptionId.ChatViews" + } + + var subscriptionId: String { + Constants.chatsSubId + } + + func build() -> SubscriptionData { + let sorts: [DataviewSort] = .builder { + SearchHelper.sort(relation: .lastMessageDate, type: .desc) + } + + let filters: [DataviewFilter] = .builder { + SearchHelper.layoutFilter([.chatDerived]) + } + + let keys: [String] = [ + BundledPropertyKey.id.rawValue, + BundledPropertyKey.name.rawValue, + BundledPropertyKey.description.rawValue, + BundledPropertyKey.spaceId.rawValue, + BundledPropertyKey.layout.rawValue, + BundledPropertyKey.resolvedLayout.rawValue, + BundledPropertyKey.type.rawValue, + BundledPropertyKey.isDeleted.rawValue + ] + + return .crossSpaceSearch( + SubscriptionData.CrossSpaceSearch( + identifier: Constants.chatsSubId, + filters: filters, + keys: keys, + noDepSubscription: true + ) + ) + } +} diff --git a/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceOneActiveSubscriptionHelper.swift b/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceOneActiveSubscriptionHelper.swift index f1de161cbc..d6a2e7d2c5 100644 --- a/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceOneActiveSubscriptionHelper.swift +++ b/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceOneActiveSubscriptionHelper.swift @@ -3,12 +3,11 @@ import AnytypeCore import Combine import Services -protocol MultispaceSearchDataBuilderProtocol: AnyObject, Sendable { +protocol MultispaceOneActiveSubscriptionDataBuilder: AnyObject, Sendable { func buildSearch(spaceId: String) -> SearchRequest + func build(accountId: String, spaceId: String, subId: String) -> SubscriptionData } -typealias MultispaceOneActiveSubscriptionDataBuilder = MultispaceSubscriptionDataBuilderProtocol & MultispaceSearchDataBuilderProtocol - actor MultispaceOneActiveSubscriptionHelper: Sendable { // MARK: - DI diff --git a/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceSubscriptionHelper.swift b/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceSubscriptionHelper.swift deleted file mode 100644 index 8362852404..0000000000 --- a/Anytype/Sources/ServiceLayer/MultispaceSubscriptionHelper/MultispaceSubscriptionHelper.swift +++ /dev/null @@ -1,80 +0,0 @@ -import Foundation -import AnytypeCore -import Combine -import Services - -protocol MultispaceSubscriptionDataBuilderProtocol: AnyObject, Sendable { - func build(accountId: String, spaceId: String, subId: String) -> SubscriptionData -} - -final class MultispaceSubscriptionHelper: Sendable { - - // MARK: - DI - - private let subIdPrefix: String - private let subscriptionBuilder: any MultispaceSubscriptionDataBuilderProtocol - - private let workspacessStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() - private let subscriptionStorageProvider: any SubscriptionStorageProviderProtocol = Container.shared.subscriptionStorageProvider() - private let accountManager: any AccountManagerProtocol = Container.shared.accountManager() - - // MARK: - State - - let data = SynchronizedDictionary() - - private let subscriptionStorages = SynchronizedDictionary() - private let spacesSubscription = AtomicStorage(nil) - - init(subIdPrefix: String, subscriptionBuilder: any MultispaceSubscriptionDataBuilderProtocol) { - self.subIdPrefix = subIdPrefix - self.subscriptionBuilder = subscriptionBuilder - } - - func startSubscription(update: @escaping @Sendable () -> Void) async { - // Start first subscription in current async context for guarantee data state before return - let spaceIds = workspacessStorage.allSpaceViews - .filter { $0.isActive || $0.isLoading } - .map { $0.targetSpaceId } - await updateSubscriptions(spaceIds: spaceIds, update: update) - - spacesSubscription.value = workspacessStorage.allSpaceViewsPublisher - .map { $0.filter { $0.isActive || $0.isLoading }.map { $0.targetSpaceId } } - .removeDuplicates() - .receiveOnMain() - .sink { [weak self] spaceIds in - Task { @Sendable [weak self] in - await self?.updateSubscriptions(spaceIds: spaceIds, update: update) - } - } - } - - func stopSubscription() async { - spacesSubscription.value?.cancel() - spacesSubscription.value = nil - for subscriptionStorage in subscriptionStorages.values { - try? await subscriptionStorage.stopSubscription() - } - subscriptionStorages.removeAll() - data.removeAll() - } - - private func updateSubscriptions(spaceIds: [String], update: @escaping (@Sendable () -> Void)) async { - for spaceId in spaceIds { - if subscriptionStorages[spaceId].isNil { - let subId = subIdPrefix + spaceId - let subscriptionStorage = subscriptionStorageProvider.createSubscriptionStorage(subId: subId) - subscriptionStorages[spaceId] = subscriptionStorage - try? await subscriptionStorage.startOrUpdateSubscription( - data: subscriptionBuilder.build(accountId: accountManager.account.id, spaceId: spaceId, subId: subId) - ) { [weak self] data in - self?.updateStorage(subscriptionState: data, spaceId: spaceId, update: update) - } - } - } - } - - private func updateStorage(subscriptionState: SubscriptionStorageState, spaceId: String, update: (() -> Void)) { - data[spaceId] = subscriptionState.items.compactMap { try? Value(details: $0) } - update() - } -} diff --git a/Anytype/Sources/ServiceLayer/Object/Search/SearchService.swift b/Anytype/Sources/ServiceLayer/Object/Search/SearchService.swift index 3c38c73aa2..666476188c 100644 --- a/Anytype/Sources/ServiceLayer/Object/Search/SearchService.swift +++ b/Anytype/Sources/ServiceLayer/Object/Search/SearchService.swift @@ -10,11 +10,13 @@ enum SearchDefaults { final class SearchService: SearchServiceProtocol, Sendable { private let searchMiddleService: any SearchMiddleServiceProtocol = Container.shared.searchMiddleService() - + private let spaceViewsStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() + // MARK: - SearchServiceProtocol func search(text: String, spaceId: String) async throws -> [ObjectDetails] { - try await searchObjectsWithLayouts(text: text, layouts: DetailsLayout.visibleLayouts, excludedIds: [], spaceId: spaceId) + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType + return try await searchObjectsWithLayouts(text: text, layouts: DetailsLayout.visibleLayouts(spaceUxType: spaceUxType), excludedIds: [], spaceId: spaceId) } func searchFiles(text: String, excludedFileIds: [String], spaceId: String) async throws -> [ObjectDetails] { @@ -73,10 +75,11 @@ final class SearchService: SearchServiceProtocol, Sendable { relation: BundledPropertyKey.lastOpenedDate, type: .desc ) + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { SearchHelper.excludedIdsFilter(excludedObjectIds) if typeIds.isEmpty { - SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayouts) + SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayouts(spaceUxType: spaceUxType), spaceUxType: spaceUxType) } else { SearchFiltersBuilder.build(isArchived: false) SearchHelper.typeFilter(typeIds) @@ -101,9 +104,10 @@ final class SearchService: SearchServiceProtocol, Sendable { relation: sortRelationKey ?? .lastOpenedDate, type: .desc ) - + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType + let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayoutsWithFiles) + SearchFiltersBuilder.build(isArchived: false, layouts: DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType), spaceUxType: spaceUxType) SearchHelper.excludedIdsFilter(excludedObjectIds) SearchHelper.excludedLayoutFilter(excludedLayouts) } @@ -112,9 +116,12 @@ final class SearchService: SearchServiceProtocol, Sendable { } func searchRelationOptions(text: String, relationKey: String, excludedObjectIds: [String], spaceId: String) async throws -> [PropertyOption] { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType + var filters = SearchFiltersBuilder.build( isArchived: false, - layouts: [DetailsLayout.relationOption] + layouts: [DetailsLayout.relationOption], + spaceUxType: spaceUxType ) filters.append(SearchHelper.relationKey(relationKey)) filters.append(SearchHelper.excludedIdsFilter(excludedObjectIds)) @@ -129,9 +136,12 @@ final class SearchService: SearchServiceProtocol, Sendable { } func searchRelationOptions(optionIds: [String], spaceId: String) async throws -> [PropertyOption] { + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType + var filters = SearchFiltersBuilder.build( isArchived: false, - layouts: [DetailsLayout.relationOption] + layouts: [DetailsLayout.relationOption], + spaceUxType: spaceUxType ) filters.append(SearchHelper.includeIdsFilter(optionIds)) @@ -145,14 +155,15 @@ final class SearchService: SearchServiceProtocol, Sendable { type: .desc, includeTime: true ) - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: [DetailsLayout.relation]) + SearchFiltersBuilder.build(isArchived: false, layouts: [DetailsLayout.relation], spaceUxType: spaceUxType) SearchHelper.relationReadonlyValue(false) SearchHelper.excludedRelationKeys(BundledPropertyKey.internalKeys.map(\.rawValue)) SearchHelper.excludedIdsFilter(excludedIds) } - + let details = try await searchMiddleService.search(spaceId: spaceId, filters: filters, sorts: [sort], fullText: text) return details.map { PropertyDetails(details: $0) } } @@ -186,12 +197,13 @@ final class SearchService: SearchServiceProtocol, Sendable { relation: BundledPropertyKey.lastOpenedDate, type: .desc ) - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: layouts) + SearchFiltersBuilder.build(isArchived: false, layouts: layouts, spaceUxType: spaceUxType) SearchHelper.excludedIdsFilter(excludedIds) } - + return try await searchMiddleService.search(spaceId: spaceId, filters: filters, sorts: [sort], fullText: text, limit: SearchDefaults.objectsLimit) } diff --git a/Anytype/Sources/ServiceLayer/Object/SearchWithMeta/SearchWithMetaService.swift b/Anytype/Sources/ServiceLayer/Object/SearchWithMeta/SearchWithMetaService.swift index 78e6e05adf..8f12d45272 100644 --- a/Anytype/Sources/ServiceLayer/Object/SearchWithMeta/SearchWithMetaService.swift +++ b/Anytype/Sources/ServiceLayer/Object/SearchWithMeta/SearchWithMetaService.swift @@ -13,11 +13,12 @@ protocol SearchWithMetaServiceProtocol: AnyObject, Sendable { } final class SearchWithMetaService: SearchWithMetaServiceProtocol, Sendable { - + private let searchWithMetaMiddleService: any SearchWithMetaMiddleServiceProtocol = Container.shared.searchWithMetaMiddleService() - + private let spaceViewsStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() + // MARK: - SearchServiceProtocol - + func search( text: String, spaceId: String, @@ -25,12 +26,13 @@ final class SearchWithMetaService: SearchWithMetaServiceProtocol, Sendable { sorts: [DataviewSort], excludedObjectIds: [String] ) async throws -> [SearchResultWithMeta] { - + + let spaceUxType = spaceViewsStorage.spaceView(spaceId: spaceId)?.uxType let filters: [DataviewFilter] = .builder { - SearchFiltersBuilder.build(isArchived: false, layouts: layouts) + SearchFiltersBuilder.build(isArchived: false, layouts: layouts, spaceUxType: spaceUxType) SearchHelper.excludedIdsFilter(excludedObjectIds) } - + return try await searchWithMetaMiddleService.search(spaceId: spaceId, filters: filters, sorts: sorts, fullText: text, limit: SearchDefaults.objectsLimit) } } diff --git a/Anytype/Sources/ServiceLayer/Object/TypeProvider/Subscription/ObjectTypeSubscriptionDataBuilder.swift b/Anytype/Sources/ServiceLayer/Object/TypeProvider/Subscription/ObjectTypeSubscriptionDataBuilder.swift index 6bc9e78e11..d61d1ef1eb 100644 --- a/Anytype/Sources/ServiceLayer/Object/TypeProvider/Subscription/ObjectTypeSubscriptionDataBuilder.swift +++ b/Anytype/Sources/ServiceLayer/Object/TypeProvider/Subscription/ObjectTypeSubscriptionDataBuilder.swift @@ -1,23 +1,24 @@ import Foundation import Services -final class ObjectTypeSubscriptionDataBuilder: MultispaceSubscriptionDataBuilderProtocol, MultispaceSearchDataBuilderProtocol { +final class ObjectTypeSubscriptionDataBuilder: MultispaceOneActiveSubscriptionDataBuilder { private let workspaceStorage: any SpaceViewsStorageProtocol = Container.shared.spaceViewsStorage() - // MARK: - MultispaceSubscriptionDataBuilderProtocol + // MARK: - MultispaceOneActiveSubscriptionDataBuilder func build(accountId: String, spaceId: String, subId: String) -> SubscriptionData { let filters = [ SearchHelper.layoutFilter([DetailsLayout.objectType]) ] - + + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType return .search( SubscriptionData.Search( identifier: subId, spaceId: spaceId, - sorts: SearchHelper.defaultObjectTypeSort(isChat: workspaceStorage.spaceIsChat(spaceId: spaceId)), + sorts: SearchHelper.defaultObjectTypeSort(spaceUxType: spaceUxType), filters: filters, limit: 0, offset: 0, @@ -27,8 +28,6 @@ final class ObjectTypeSubscriptionDataBuilder: MultispaceSubscriptionDataBuilder ) } - // MARK: - MultispaceSearchDataBuilderProtocol - func buildSearch(spaceId: String) -> SearchRequest { let sort = SearchHelper.sort( relation: BundledPropertyKey.name, diff --git a/Anytype/Sources/ServiceLayer/Object/TypesService/SearchHelper+Extension.swift b/Anytype/Sources/ServiceLayer/Object/TypesService/SearchHelper+Extension.swift index 1ab9e0bf66..903a678504 100644 --- a/Anytype/Sources/ServiceLayer/Object/TypesService/SearchHelper+Extension.swift +++ b/Anytype/Sources/ServiceLayer/Object/TypesService/SearchHelper+Extension.swift @@ -1,11 +1,12 @@ import Services extension SearchHelper { - - static func defaultObjectTypeSort(isChat: Bool) -> [DataviewSort] { + + static func defaultObjectTypeSort(spaceUxType: SpaceUxType?) -> [DataviewSort] { let nameSort = SearchHelper.sort(relation: .name, type: .asc) - - let customSort = isChat + + let supportsMultiChats = spaceUxType?.supportsMultiChats ?? true + let customSort = !supportsMultiChats ? SearchHelper.customSort(relationKey: BundledPropertyKey.uniqueKey.rawValue, values: [ ObjectTypeUniqueKey.image.value, ObjectTypeUniqueKey.bookmark.value, @@ -23,6 +24,7 @@ extension SearchHelper { ObjectTypeUniqueKey.page.value, ObjectTypeUniqueKey.note.value, ObjectTypeUniqueKey.task.value, + ObjectTypeUniqueKey.chatDerived.value, ObjectTypeUniqueKey.collection.value, ObjectTypeUniqueKey.set.value, ObjectTypeUniqueKey.bookmark.value, diff --git a/Anytype/Sources/ServiceLayer/Object/TypesService/TypesService.swift b/Anytype/Sources/ServiceLayer/Object/TypesService/TypesService.swift index ea0067e62d..7d42240a06 100644 --- a/Anytype/Sources/ServiceLayer/Object/TypesService/TypesService.swift +++ b/Anytype/Sources/ServiceLayer/Object/TypesService/TypesService.swift @@ -55,11 +55,12 @@ final class TypesService: TypesServiceProtocol, Sendable { spaceId: String ) async throws -> [ObjectDetails] { let excludedTypeIds = includePins ? [] : try await searchPinnedTypes(text: "", spaceId: spaceId).map { $0.id } - - let sort = SearchHelper.defaultObjectTypeSort(isChat: workspaceStorage.spaceIsChat(spaceId: spaceId)) - - var layouts = includeFiles ? DetailsLayout.visibleLayoutsWithFiles : DetailsLayout.visibleLayouts - + + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType + let sort = SearchHelper.defaultObjectTypeSort(spaceUxType: spaceUxType) + + var layouts = includeFiles ? DetailsLayout.visibleLayoutsWithFiles(spaceUxType: spaceUxType) : DetailsLayout.visibleLayouts(spaceUxType: spaceUxType) + if !includeLists { layouts.removeAll(where: { $0.isList }) } @@ -83,6 +84,9 @@ final class TypesService: TypesServiceProtocol, Sendable { if !includeTemplates { SearchHelper.uniqueKeyFilter(key: ObjectTypeUniqueKey.template.value, include: false) } + if !includeChat { + SearchHelper.uniqueKeyFilter(key: ObjectTypeUniqueKey.chatDerived.value, include: false) + } } let result = try await searchMiddleService.search(spaceId: spaceId, filters: filters, sorts: sort, fullText: text) @@ -96,9 +100,10 @@ final class TypesService: TypesServiceProtocol, Sendable { spaceId: String ) async throws -> [ObjectType] { let excludedTypeIds = includePins ? [] : try await searchPinnedTypes(text: "", spaceId: spaceId).map { $0.id } - - let sort = SearchHelper.defaultObjectTypeSort(isChat: workspaceStorage.spaceIsChat(spaceId: spaceId)) - + + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType + let sort = SearchHelper.defaultObjectTypeSort(spaceUxType: spaceUxType) + let filters: [DataviewFilter] = .builder { SearchFiltersBuilder.build(isArchived: false) SearchHelper.layoutFilter([DetailsLayout.objectType]) @@ -112,12 +117,13 @@ final class TypesService: TypesServiceProtocol, Sendable { func searchLibraryObjectTypes(text: String, includeInstalledTypes: Bool, spaceId: String) async throws -> [ObjectDetails] { let excludedIds = includeInstalledTypes ? [] : typeProvider.objectTypes(spaceId: spaceId).map(\.sourceObject) - - let sort = SearchHelper.defaultObjectTypeSort(isChat: workspaceStorage.spaceIsChat(spaceId: spaceId)) - + + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType + let sort = SearchHelper.defaultObjectTypeSort(spaceUxType: spaceUxType) + let filters = Array.builder { SearchHelper.layoutFilter([DetailsLayout.objectType]) - SearchHelper.recomendedLayoutFilter(DetailsLayout.visibleLayouts) + SearchHelper.recomendedLayoutFilter(DetailsLayout.visibleLayouts(spaceUxType: spaceUxType)) SearchHelper.excludedIdsFilter(excludedIds) } diff --git a/Anytype/Sources/ServiceLayer/ParticipantSpaceStorage/ParticipantSpacesStorage.swift b/Anytype/Sources/ServiceLayer/ParticipantSpaceStorage/ParticipantSpacesStorage.swift index a9d839708e..355480b972 100644 --- a/Anytype/Sources/ServiceLayer/ParticipantSpaceStorage/ParticipantSpacesStorage.swift +++ b/Anytype/Sources/ServiceLayer/ParticipantSpaceStorage/ParticipantSpacesStorage.swift @@ -1,7 +1,8 @@ import Foundation -import Combine +@preconcurrency import Combine import Services import AnytypeCore +import AsyncAlgorithms protocol ParticipantSpacesStorageProtocol: AnyObject, Sendable { var allParticipantSpaces: [ParticipantSpaceViewData] { get } @@ -54,8 +55,8 @@ final class ParticipantSpacesStorage: ParticipantSpacesStorageProtocol { private let participantsStorage: any ParticipantsStorageProtocol = Container.shared.participantsStorage() private let serverConfigurationStorage: any ServerConfigurationStorageProtocol = Container.shared.serverConfigurationStorage() private let profileStorage: any ProfileStorageProtocol = Container.shared.profileStorage() - - private let subscription = AtomicStorage(nil) + + private let subscription = AtomicStorage?>(nil) private let allParticipantSpacesStorage = AtomicPublishedStorage<[ParticipantSpaceViewData]>([]) @@ -75,10 +76,11 @@ final class ParticipantSpacesStorage: ParticipantSpacesStorageProtocol { } func startSubscription() async { - subscription.value = Publishers.CombineLatest(spaceViewsStorage.allSpaceViewsPublisher, participantsStorage.participantsPublisher) - .sink { [weak self] spaces, participants in + subscription.value = Task.detached { [weak self, spaceViewsStorage, participantsStorage] in + for await (spaces, participants) in combineLatest(spaceViewsStorage.allSpaceViewsPublisher.values, participantsStorage.participantsSequence) { self?.updateData(spaces: spaces, participants: participants) } + } } func stopSubscription() async { diff --git a/Anytype/Sources/ServiceLayer/ParticipantStorage/ParticipantsStorage.swift b/Anytype/Sources/ServiceLayer/ParticipantStorage/ParticipantsStorage.swift index 68233442b8..30258d9937 100644 --- a/Anytype/Sources/ServiceLayer/ParticipantStorage/ParticipantsStorage.swift +++ b/Anytype/Sources/ServiceLayer/ParticipantStorage/ParticipantsStorage.swift @@ -2,61 +2,76 @@ import Foundation import Services import Combine import AnytypeCore +import AsyncTools +import AsyncAlgorithms protocol ParticipantsStorageProtocol: AnyObject, Sendable { var participants: [Participant] { get } - var participantsPublisher: AnyPublisher<[Participant], Never> { get } + var participantsSequence: AnyAsyncSequence<[Participant]> { get } func startSubscription() async func stopSubscription() async } extension ParticipantsStorageProtocol { - func participantPublisher(spaceId: String) -> AnyPublisher { - participantsPublisher.compactMap { $0.first { $0.spaceId == spaceId } }.eraseToAnyPublisher() + func participantSequence(spaceId: String) -> AnyAsyncSequence { + participantsSequence.compactMap { $0.first { $0.spaceId == spaceId } }.removeDuplicates().eraseToAnyAsyncSequence() } - func permissionPublisher(spaceId: String) -> AnyPublisher { - participantPublisher(spaceId: spaceId).map(\.permission).removeDuplicates().eraseToAnyPublisher() + func permissionSequence(spaceId: String) -> AnyAsyncSequence { + participantSequence(spaceId: spaceId).map(\.permission).removeDuplicates().eraseToAnyAsyncSequence() } - func canEditPublisher(spaceId: String) -> AnyPublisher { - participantPublisher(spaceId: spaceId).map(\.permission.canEdit).removeDuplicates().eraseToAnyPublisher() + func canEditSequence(spaceId: String) -> AnyAsyncSequence { + participantSequence(spaceId: spaceId).map(\.permission.canEdit).removeDuplicates().eraseToAnyAsyncSequence() } } -final class ParticipantsStorage: ParticipantsStorageProtocol, Sendable { +actor ParticipantsStorage: ParticipantsStorageProtocol, Sendable { - private enum Constants { - static let subscriptionIdPrefix = "SubscriptionId.Participant-" - } + private let subscriptionId = "SubscriptionId.Participant-\(UUID().uuidString)" // MARK: - DI - - private let multispaceSubscriptionHelper = MultispaceSubscriptionHelper( - subIdPrefix: Constants.subscriptionIdPrefix, - subscriptionBuilder: AcountParticipantSubscriptionBuilder() - ) - private let storage = AtomicPublishedStorage<[Participant]>([]) - + + private let stream = AsyncToManyStream<[Participant]>() + private var subscription: Task? + + @LazyInjected(\.subscriptionStorageProvider) + private var subscriptionStorageProvider: any SubscriptionStorageProviderProtocol + @Injected(\.accountManager) + private var accountManager: any AccountManagerProtocol + + private lazy var subscriptionStorage: any SubscriptionStorageProtocol = { + subscriptionStorageProvider.createSubscriptionStorage(subId: subscriptionId) + }() + + private let subscriptionBuilder = AcountParticipantSubscriptionBuilder() + // MARK: - State - var participants: [Participant] { storage.value } - var participantsPublisher: AnyPublisher<[Participant], Never> { storage.publisher.removeDuplicates().eraseToAnyPublisher() } + nonisolated var participants: [Participant] { stream.value ?? [] } + nonisolated var participantsSequence: AnyAsyncSequence<[Participant]> { stream.eraseToAnyAsyncSequence() } func startSubscription() async { - await multispaceSubscriptionHelper.startSubscription { [weak self] in - self?.updatePartiipants() + guard subscription.isNil else { + anytypeAssertionFailure("Try to start ParticipantsStorage multiple times") + return + } + + let data = subscriptionBuilder.build(accountId: accountManager.account.id, subId: subscriptionId) + try? await subscriptionStorage.startOrUpdateSubscription(data: data) + + subscription = Task { [weak self, subscriptionStorage] in + for await state in subscriptionStorage.statePublisher.values { + let participants = state.items.compactMap { try? Participant(details: $0) } + self?.stream.send(participants) + } } } func stopSubscription() async { - await multispaceSubscriptionHelper.stopSubscription() - storage.value.removeAll() - } - - // MARK: - Private - - private func updatePartiipants() { - storage.value = multispaceSubscriptionHelper.data.values.flatMap { $0 } + try? await subscriptionStorage.stopSubscription() + subscription?.cancel() + subscription = nil + stream.clearLastValue() } } diff --git a/Anytype/Sources/ServiceLayer/PropertyStorage/Subscription/PropertySubscriptionDataBuilder.swift b/Anytype/Sources/ServiceLayer/PropertyStorage/Subscription/PropertySubscriptionDataBuilder.swift index 5459447eb1..a0bf0b9137 100644 --- a/Anytype/Sources/ServiceLayer/PropertyStorage/Subscription/PropertySubscriptionDataBuilder.swift +++ b/Anytype/Sources/ServiceLayer/PropertyStorage/Subscription/PropertySubscriptionDataBuilder.swift @@ -1,9 +1,9 @@ import Foundation import Services -final class PropertySubscriptionDataBuilder: MultispaceSubscriptionDataBuilderProtocol, MultispaceSearchDataBuilderProtocol { +final class PropertySubscriptionDataBuilder: MultispaceOneActiveSubscriptionDataBuilder { - // MARK: - MultispaceSubscriptionDataBuilderProtocol + // MARK: - MultispaceOneActiveSubscriptionDataBuilder func build(accountId: String, spaceId: String, subId: String) -> SubscriptionData { let sort = SearchHelper.sort( @@ -29,8 +29,6 @@ final class PropertySubscriptionDataBuilder: MultispaceSubscriptionDataBuilderPr ) } - // MARK: - MultispaceSearchDataBuilderProtocol - func buildSearch(spaceId: String) -> SearchRequest { let sort = SearchHelper.sort( relation: BundledPropertyKey.name, diff --git a/Anytype/Sources/ServiceLayer/ServicesDI.swift b/Anytype/Sources/ServiceLayer/ServicesDI.swift index 3b7f900daf..e4a66d4c1a 100644 --- a/Anytype/Sources/ServiceLayer/ServicesDI.swift +++ b/Anytype/Sources/ServiceLayer/ServicesDI.swift @@ -19,7 +19,11 @@ extension Container { var spaceViewsStorage: Factory { self { SpaceViewsStorage() }.singleton } - + + var chatDetailsStorage: Factory { + self { ChatDetailsStorage() }.singleton + } + var singleObjectSubscriptionService: Factory { self { SingleObjectSubscriptionService() } } @@ -203,7 +207,11 @@ extension Container { var spaceViewsSubscriptionBuilder: Factory { self { SpaceViewsSubscriptionBuilder() }.shared } - + + var chatDetailsSubscriptionBuilder: Factory { + self { ChatDetailsSubscriptionBuilder() }.shared + } + var serverConfigurationStorage: Factory { self { ServerConfigurationStorage() }.singleton } diff --git a/Anytype/Sources/ServiceLayer/SpaceIconForNotificationsHandler/SpaceIconForNotificationsHandler.swift b/Anytype/Sources/ServiceLayer/SpaceIconForNotificationsHandler/SpaceIconForNotificationsHandler.swift index ce77ff0534..e6442e2856 100644 --- a/Anytype/Sources/ServiceLayer/SpaceIconForNotificationsHandler/SpaceIconForNotificationsHandler.swift +++ b/Anytype/Sources/ServiceLayer/SpaceIconForNotificationsHandler/SpaceIconForNotificationsHandler.swift @@ -19,11 +19,13 @@ actor SpaceIconForNotificationsHandler: SpaceIconForNotificationsHandlerProtocol @UserDefault("SpaceIcon.SavedItems", defaultValue: [:]) private var savedIcons: [String: Int] - private var workspaceSubscription: Task? + private var workspaceSubscription: Task? private var tasks = [String: Task]() func startUpdating() async { - workspaceSubscription = Task { [weak self, workspacesStorage] in + workspaceSubscription = Task(priority: .utility) { [weak self, workspacesStorage] in + // Do not affect the start of the application. The images are rendered on the main thread. + try await Task.sleep(seconds: 10) for await workspaces in workspacesStorage.allSpaceViewsPublisher.values { await self?.handleSpaces(workspaces: workspaces) } diff --git a/Anytype/Sources/ServiceLayer/SpaceStorage/Models/SpaceView.swift b/Anytype/Sources/ServiceLayer/SpaceStorage/Models/SpaceView.swift index cbee684d9f..ad2a4bd843 100644 --- a/Anytype/Sources/ServiceLayer/SpaceStorage/Models/SpaceView.swift +++ b/Anytype/Sources/ServiceLayer/SpaceStorage/Models/SpaceView.swift @@ -20,6 +20,9 @@ struct SpaceView: Identifiable, Equatable, Hashable { let uxType: SpaceUxType let pushNotificationEncryptionKey: String let pushNotificationMode: SpacePushNotificationsMode + let forceAllIds: [String] + let forceMuteIds: [String] + let forceMentionIds: [String] } extension SpaceView: DetailsModel { @@ -41,6 +44,9 @@ extension SpaceView: DetailsModel { self.uxType = details.spaceUxTypeValue ?? .data self.pushNotificationEncryptionKey = details.spacePushNotificationEncryptionKey self.pushNotificationMode = details.spacePushNotificationModeValue ?? .all + self.forceAllIds = details.spacePushNotificationForceAllIds + self.forceMuteIds = details.spacePushNotificationForceMuteIds + self.forceMentionIds = details.spacePushNotificationForceMentionIds } static let subscriptionKeys: [BundledPropertyKey] = .builder { @@ -62,6 +68,9 @@ extension SpaceView: DetailsModel { BundledPropertyKey.spaceUxType BundledPropertyKey.spacePushNotificationEncryptionKey BundledPropertyKey.spacePushNotificationMode + BundledPropertyKey.spacePushNotificationForceAllIds + BundledPropertyKey.spacePushNotificationForceMuteIds + BundledPropertyKey.spacePushNotificationForceMentionIds } } @@ -103,11 +112,7 @@ extension SpaceView { var canAddChatWidget: Bool { !initialScreenIsChat && isShared && hasChat } - - var canShowChatWidget: Bool { - !initialScreenIsChat && hasChat - } - + var hasChat: Bool { chatId.isNotEmpty } @@ -129,4 +134,17 @@ extension SpaceView { private func activeWriters(participants: [Participant]) -> Int { participants.filter { $0.permission == .writer || $0.permission == .owner }.count } + + func effectiveNotificationMode(for chatId: String) -> SpacePushNotificationsMode { + if forceAllIds.contains(chatId) { + return .all + } + if forceMuteIds.contains(chatId) { + return .nothing + } + if forceMentionIds.contains(chatId) { + return .mentions + } + return pushNotificationMode + } } diff --git a/Anytype/Sources/ServiceLayer/SpaceStorage/SpaceViewsStorage.swift b/Anytype/Sources/ServiceLayer/SpaceStorage/SpaceViewsStorage.swift index 4be707e470..2cf0fa84eb 100644 --- a/Anytype/Sources/ServiceLayer/SpaceStorage/SpaceViewsStorage.swift +++ b/Anytype/Sources/ServiceLayer/SpaceStorage/SpaceViewsStorage.swift @@ -32,10 +32,6 @@ extension SpaceViewsStorageProtocol { .removeDuplicates() .eraseToAnyPublisher() } - - func spaceIsChat(spaceId: String) -> Bool { - spaceView(spaceId: spaceId)?.uxType.isChat ?? false - } } final class SpaceViewsStorage: SpaceViewsStorageProtocol { diff --git a/Anytype/Sources/ServiceLayer/StoreKitService/PromoTierJWTGenerator.swift b/Anytype/Sources/ServiceLayer/StoreKitService/PromoTierJWTGenerator.swift deleted file mode 100644 index 7c3ff1d7ce..0000000000 --- a/Anytype/Sources/ServiceLayer/StoreKitService/PromoTierJWTGenerator.swift +++ /dev/null @@ -1,71 +0,0 @@ -import Foundation -import CryptoKit -import AnytypeCore -import Services - - -final class PromoTierJWTGenerator { - // Temporary promo tiers for AnyApp - func promoTierReceiptString(account: AccountData) -> String? { - do { - // Step 1: Retrieve Secret from Info.plist - guard let secret = Bundle.main.object(forInfoDictionaryKey: "AnyAppMembershipTierSecret") as? String else { - print("Error: Secret not found in Info.plist") - return nil - } - - // Step 2: Generate a Private Key (Temporary Key for Signing) - let privateKey = P256.Signing.PrivateKey() - - // Step 3: Create a JSON Payload - let payloadDict: [String: Any] = [ - "ProductID": account.id, - "BundleID": "pioneer", - "OfferIdentifier": secret, - "AppAccountToken": account.info.ethereumAddress - ] - - // Convert JSON to Data - guard let jsonData = try? JSONSerialization.data(withJSONObject: payloadDict, options: []) else { - anytypeAssertionFailure("Error: Failed to encode payload JSON") - return nil - } - let payloadBase64 = jsonData.base64EncodedString() - - // Step 4: Create the JWS Header - let headerDict: [String: Any] = [ - "alg": "ES256", // Algorithm - "typ": "JWT" // Type - ] - - // Convert header to Data - guard let headerData = try? JSONSerialization.data(withJSONObject: headerDict, options: []) else { - anytypeAssertionFailure("Error: Failed to encode header JSON") - return nil - } - let headerBase64 = headerData.base64EncodedString() - - // Step 5: Create the Signing Input - let signingInput = "\(headerBase64).\(payloadBase64)" - guard let signingInputData = signingInput.data(using: .utf8) else { - anytypeAssertionFailure("Error: Failed to encode signing input") - return nil - } - - // Step 6: Generate a Signature - let signature = try privateKey.signature(for: signingInputData) - - // Convert Signature to Base64 - let signatureBase64 = signature.derRepresentation.base64EncodedString() - - // Step 7: Construct the Final JWS String - let jwsString = "\(signingInput).\(signatureBase64)" - - return jwsString - } catch { - anytypeAssertionFailure("Error generating JWS: \(error)") - return nil - } - } - -} diff --git a/Anytype/Sources/ServiceLayer/StoreKitService/StoreKitService.swift b/Anytype/Sources/ServiceLayer/StoreKitService/StoreKitService.swift index 4c9b89a8cf..2453570c1b 100644 --- a/Anytype/Sources/ServiceLayer/StoreKitService/StoreKitService.swift +++ b/Anytype/Sources/ServiceLayer/StoreKitService/StoreKitService.swift @@ -35,8 +35,6 @@ public protocol StoreKitServiceProtocol: Sendable { func startListenForTransactions() async func stopListenForTransactions() async - - func activatePromoTier() async } actor StoreKitService: StoreKitServiceProtocol { @@ -133,19 +131,6 @@ actor StoreKitService: StoreKitServiceProtocol { } } - // Temporary promo tiers for AnyApp - func activatePromoTier() async { - guard let promoReceipt = PromoTierJWTGenerator().promoTierReceiptString(account: accountManager.account) else { - return - } - - do { - try await membershipService.verifyReceipt(receipt: promoReceipt) - } catch let error { - anytypeAssertionFailure(error.localizedDescription) - } - } - // MARK: - Private private func checkVerified(_ verificationResult: VerificationResult) throws -> T { diff --git a/Anytype/Sources/ServiceLayer/Subscriptions/RecentSubscriptionService.swift b/Anytype/Sources/ServiceLayer/Subscriptions/RecentSubscriptionService.swift index a7efaf4de7..517acf1a95 100644 --- a/Anytype/Sources/ServiceLayer/Subscriptions/RecentSubscriptionService.swift +++ b/Anytype/Sources/ServiceLayer/Subscriptions/RecentSubscriptionService.swift @@ -41,10 +41,11 @@ final class RecentSubscriptionService: RecentSubscriptionServiceProtocol { ) async { let sort = makeSort(type: type) - + let spaceUxType = workspaceStorage.spaceView(spaceId: spaceId)?.uxType + let filters: [DataviewFilter] = .builder { SearchHelper.notHiddenFilters() - SearchHelper.layoutFilter(DetailsLayout.visibleLayouts) + SearchHelper.layoutFilter(DetailsLayout.visibleLayouts(spaceUxType: spaceUxType)) SearchHelper.templateScheme(include: false) makeDateFilter(type: type, spaceId: spaceId) } diff --git a/Anytype/Sources/ServiceLayer/SubscriptionsToggler/Internals/SubscriptionToggler.swift b/Anytype/Sources/ServiceLayer/SubscriptionsToggler/Internals/SubscriptionToggler.swift index 02c69adfc5..c74f287fe2 100644 --- a/Anytype/Sources/ServiceLayer/SubscriptionsToggler/Internals/SubscriptionToggler.swift +++ b/Anytype/Sources/ServiceLayer/SubscriptionsToggler/Internals/SubscriptionToggler.swift @@ -20,6 +20,8 @@ final class SubscriptionToggler: SubscriptionTogglerProtocol { return try await makeSearchToggler(data: data) case let .objects(data): return try await makeObjectsToggler(data: data) + case let .crossSpaceSearch(data): + return try await makeCrossSpaceSearchToggler(data: data) } } @@ -57,4 +59,16 @@ final class SubscriptionToggler: SubscriptionTogglerProtocol { nextCount: response.nextCount ) } + + private func makeCrossSpaceSearchToggler(data: SubscriptionData.CrossSpaceSearch) async throws -> SubscriptionTogglerResult { + let response = try await objectSubscriptionService.objectCrossSpaceSearchSubscribe(data: data) + + return SubscriptionTogglerResult( + records: response.records, + dependencies: response.dependencies, + total: response.total, + prevCount: response.prevCount, + nextCount: response.nextCount + ) + } } diff --git a/Anytype/Sources/ServiceLayer/SubscriptionsToggler/SubscriptionData+Info.swift b/Anytype/Sources/ServiceLayer/SubscriptionsToggler/SubscriptionData+Info.swift index 87eda492b9..7e8b9e2f90 100644 --- a/Anytype/Sources/ServiceLayer/SubscriptionsToggler/SubscriptionData+Info.swift +++ b/Anytype/Sources/ServiceLayer/SubscriptionsToggler/SubscriptionData+Info.swift @@ -7,6 +7,8 @@ extension SubscriptionData { return description.identifier case .objects(let description): return description.identifier + case .crossSpaceSearch(let description): + return description.identifier } } } diff --git a/Anytype/Sources/ServiceLayer/SyncStatus/SyncStatusStorage.swift b/Anytype/Sources/ServiceLayer/SyncStatus/SyncStatusStorage.swift index 4159ca8004..6813ab3ec2 100644 --- a/Anytype/Sources/ServiceLayer/SyncStatus/SyncStatusStorage.swift +++ b/Anytype/Sources/ServiceLayer/SyncStatus/SyncStatusStorage.swift @@ -5,7 +5,8 @@ import ProtobufMessages protocol SyncStatusStorageProtocol: Sendable { func statusPublisher(spaceId: String) -> AnyPublisher - + func allSpacesStatusPublisher() -> AnyPublisher<[SpaceSyncStatusInfo], Never> + func startSubscription() async func stopSubscriptionAndClean() async } @@ -22,6 +23,12 @@ actor SyncStatusStorage: SyncStatusStorageProtocol, Sendable { .compactMap { $0[spaceId] } .eraseToAnyPublisher() } + + nonisolated func allSpacesStatusPublisher() -> AnyPublisher<[SpaceSyncStatusInfo], Never> { + storage.publisher + .map { Array($0.values) } + .eraseToAnyPublisher() + } func startSubscription() async { subscription = EventBunchSubscribtion.default.addHandler { [weak self] events in diff --git a/Anytype/Supporting files/GoogleServices/GoogleService-Info-AnyApp-Release.plist b/Anytype/Supporting files/GoogleServices/GoogleService-Info-AnyApp-Release.plist deleted file mode 100644 index ec9e33eaea..0000000000 --- a/Anytype/Supporting files/GoogleServices/GoogleService-Info-AnyApp-Release.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - API_KEY - AIzaSyAxmACAyoaRFvn6uyFpnC2hrrILzhZc5Os - GCM_SENDER_ID - 398281119989 - PLIST_VERSION - 1 - BUNDLE_ID - org.any.app - PROJECT_ID - anytype-apps - STORAGE_BUCKET - anytype-apps.firebasestorage.app - IS_ADS_ENABLED - - IS_ANALYTICS_ENABLED - - IS_APPINVITE_ENABLED - - IS_GCM_ENABLED - - IS_SIGNIN_ENABLED - - GOOGLE_APP_ID - 1:398281119989:ios:8ca0a1ebef9a8cd5644dbc - - \ No newline at end of file diff --git a/Anytype/Supporting files/Info.plist b/Anytype/Supporting files/Info.plist index a89b656125..6d57be63c5 100644 --- a/Anytype/Supporting files/Info.plist +++ b/Anytype/Supporting files/Info.plist @@ -2,14 +2,8 @@ - AIEndpoint - - AIModel - AmplitudeApiKey - AnyAppMembershipTierSecret - CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleExecutable @@ -81,8 +75,6 @@ INSendMessageIntent ConfigurationIntent - OpenAIToken - SentryDSN SentryEnv diff --git a/AnytypeNotificationServiceExtension/AnytypeNotificationServiceExtensionRelease-AnyApp.entitlements b/AnytypeNotificationServiceExtension/AnytypeNotificationServiceExtensionRelease-AnyApp.entitlements deleted file mode 100644 index e5201069a9..0000000000 --- a/AnytypeNotificationServiceExtension/AnytypeNotificationServiceExtensionRelease-AnyApp.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.org.any.app - - - diff --git a/AnytypeShareExtension/AnytypeShareExtensionRelease-AnyApp.entitlements b/AnytypeShareExtension/AnytypeShareExtensionRelease-AnyApp.entitlements deleted file mode 100644 index e5201069a9..0000000000 --- a/AnytypeShareExtension/AnytypeShareExtensionRelease-AnyApp.entitlements +++ /dev/null @@ -1,10 +0,0 @@ - - - - - com.apple.security.application-groups - - group.org.any.app - - - diff --git a/AnytypeShareExtension/ShareViewController.swift b/AnytypeShareExtension/ShareViewController.swift index 15cc9b6003..47e7544719 100644 --- a/AnytypeShareExtension/ShareViewController.swift +++ b/AnytypeShareExtension/ShareViewController.swift @@ -16,8 +16,6 @@ class ShareViewController: UIViewController { private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .debug) #elseif RELEASE_ANYTYPE private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .releaseAnytype) - #elseif RELEASE_ANYAPP - private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .releaseAnyApp) #endif override func viewDidLoad() { diff --git a/AnytypeTests/Markdown/BeginingOfTextMarkdownListenerTests.swift b/AnytypeTests/Markdown/BeginingOfTextMarkdownListenerTests.swift index afbe81f8f6..8abb14cc39 100644 --- a/AnytypeTests/Markdown/BeginingOfTextMarkdownListenerTests.swift +++ b/AnytypeTests/Markdown/BeginingOfTextMarkdownListenerTests.swift @@ -32,7 +32,7 @@ class BeginingOfTextMarkdownListenerTests: XCTestCase { type: BlockContentType, success: Bool = true ) { - let shortcutByDeletingSpaces = shortcut.replacingOccurrences(of: " ", with: "") + let shortcutByDeletingSpaces = shortcut.replacing(" ", with: "") let data = buildData( text: shortcutByDeletingSpaces, carretPosition: shortcutByDeletingSpaces.count diff --git a/AnytypeWidget/AnytypeWidget.swift b/AnytypeWidget/AnytypeWidget.swift index c7e5f87b93..af24bd9355 100644 --- a/AnytypeWidget/AnytypeWidget.swift +++ b/AnytypeWidget/AnytypeWidget.swift @@ -44,8 +44,6 @@ struct AnytypeWidgetEntryView : View { private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .debug) #elseif RELEASE_ANYTYPE private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .releaseAnytype) - #elseif RELEASE_ANYAPP - private let deepLinkParser = DeepLinkDI.shared.parser(targetType: .releaseAnyApp) #endif var body: some View { diff --git a/CLAUDE.md b/CLAUDE.md index b44d6613a6..bf4f0beb2a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,9 +6,11 @@ Anytype is a privacy-focused, local-first workspace application for iOS. Built w ## 🚀 Quick Start ### âš ī¸ CRITICAL RULES - NEVER VIOLATE -1. **NEVER add AI signatures to commits** - No "Co-Authored-By: Claude " -2. **NEVER add AI signatures to PRs** - No "🤖 Generated with Claude Code" -3. **NEVER add any form of AI attribution** anywhere in the codebase +1. **NEVER commit changes without explicit user request** - Always wait for user to explicitly ask you to commit +2. **NEVER stage files without explicit user request** - Always wait for user to explicitly ask you to stage files with `git add` +3. **NEVER add AI signatures to commits** - No "Co-Authored-By: Claude " +4. **NEVER add AI signatures to PRs** - No "🤖 Generated with Claude Code" +5. **NEVER add any form of AI attribution** anywhere in the codebase ### Development Setup 1. **First-time setup** (run in order): @@ -23,14 +25,8 @@ Anytype is a privacy-focused, local-first workspace application for iOS. Built w - Swift Package Manager (built-in) - If Dependencies/Middleware/Lib.xcframework is missing binaries, try `make generate` -### Build & Test -```bash -# Normal build -xcodebuild -scheme Anytype -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 15' build - -# Compilation check -xcodebuild -scheme Anytype -configuration Debug -destination 'platform=iOS Simulator,name=iPhone 15' build-for-testing -``` +### Compilation Verification +After making code changes, report them to the user who will verify compilation in Xcode (faster with caches). ### Essential Commands ```bash @@ -43,10 +39,98 @@ make setup-middle # Initial setup ### AI Assistance - **Always present a detailed action plan before implementing multi-step changes and await approval before proceeding** +- **When code review is approved**: Proceed directly with push and PR creation without asking for confirmation + +### 📚 Skills System & Documentation (Progressive Disclosure) + +**Level 1 - This File**: Quick start, critical rules, high-level overview +**Level 2 - Skills**: Context-aware guides that auto-activate → `.claude/skills/` +**Level 3 - Specialized Docs**: Deep knowledge for specific domains + +#### Auto-Activating Skills + +The skills system provides context-aware guidance that auto-activates based on your work: +- **ios-dev-guidelines** → Auto-activates when working with `.swift` files +- **localization-developer** → Auto-activates for localization work +- **code-generation-developer** → Auto-activates for code generation +- **design-system-developer** → Auto-activates for UI/design work +- **code-review-developer** → Auto-activates when reviewing PRs or code changes +- **analytics-developer** → Auto-activates for analytics events and route tracking +- **feature-toggle-developer** → Auto-activates for feature flag removal +- **skills-manager** → Auto-activates for skill system management + +**How it works**: When you start a task, the system analyzes your prompt and file context, then automatically suggests relevant skills. No manual loading needed. + +**🚨 CRITICAL: Claude Must Actively Use Skills** + +The hook system only **suggests** skills - it does NOT auto-load them. When you (Claude) see skill suggestions in system reminders, you MUST: + +1. **📚 When you see "Relevant Skill: X"**: + - IMMEDIATELY read `.claude/skills/X/SKILL.md` + - Apply the patterns and rules from that skill + - Don't just acknowledge - actively use the skill's guidance + +2. **💡 When you see "NO SKILLS ACTIVATED"**: + - ASK the user: "Should the [skill-name] skill have activated for this task?" + - If yes, run: `.claude/hooks/utils/extract-keywords.sh "user's prompt"` + - Then run: `.claude/hooks/utils/add-keywords-to-skill.sh ` + - This teaches the system for future prompts + +3. **đŸŽ¯ Be Proactive**: + - Notice skill suggestions in EVERY system reminder + - Read suggested skills even if you think you know the answer + - Skills contain critical, project-specific patterns you must follow + +**Example Flow**: +``` +User: "Add analytics to track button clicks" +System: 📚 Relevant Skill: analytics-developer +Claude: [Reads .claude/skills/analytics-developer/SKILL.md] +Claude: [Follows the patterns in that skill] +``` + +**Why This Matters**: +- Skills contain CRITICAL project-specific rules (e.g., "NEVER hardcode strings") +- Each instance of Claude needs to learn from skills, not just general knowledge +- The skill system enables consistent behavior across all Claude instances + +**Auto-learning**: When the system fails to activate a skill for a substantial prompt (100+ chars or 3+ lines): +1. You'll be prompted with available skills +2. If you identify which skill should have activated, tell Claude +3. Claude extracts relevant keywords from your prompt +4. Keywords are automatically added to skill-rules.json +5. Future similar prompts will auto-activate the skill + +**Manual keyword management**: +```bash +# Extract keywords from a prompt +.claude/hooks/utils/extract-keywords.sh "your prompt text" + +# Add keywords to a skill +.claude/hooks/utils/add-keywords-to-skill.sh [keyword2] ... + +# Example +.claude/hooks/utils/add-keywords-to-skill.sh localization-developer "membership" "tiers" +``` + +**Learn more**: See `.claude/skills/README.md` for system overview and `.claude/hooks/README.md` for automation details. + +#### Specialized Documentation + +For deep knowledge, see these guides: + +| Topic | Quick Reference (Skills) | Complete Guide (Specialized Docs) | +|-------|-------------------------|-----------------------------------| +| **iOS Development** | `.claude/skills/ios-dev-guidelines/` | `Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md` | +| **Localization** | `.claude/skills/localization-developer/` | `Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md` | +| **Code Generation** | `.claude/skills/code-generation-developer/` | `Modules/AnytypeCore/CODE_GENERATION_GUIDE.md` | +| **Design System** | `.claude/skills/design-system-developer/` | `Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md` | +| **Typography** | `.claude/skills/design-system-developer/` | `Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md` | +| **Code Review** | `.claude/skills/code-review-developer/` | `.claude/CODE_REVIEW_GUIDE.md` | ### Code Quality - **Never edit files marked with `// Generated using Sourcery/SwiftGen`** - These are automatically generated -- **Never use hardcoded strings in UI** - Always use localization constants +- **Never use hardcoded strings in UI** - Always use localization constants (see LOCALIZATION_GUIDE.md) - **All user-facing text must be localized** for international support - **Do not add comments** unless explicitly requested - **We only work in feature branches** - never push directly to develop/main @@ -57,230 +141,132 @@ make setup-middle # Initial setup - Mock implementations (`Anytype/Sources/PreviewMocks/Mocks/`) - Dependency injection registrations (`MockView.swift`, test setup files) -## 📝 Localization System +## 📝 Localization System (Quick Reference) + +**Full Guide**: `Anytype/Sources/PresentationLayer/Common/LOCALIZATION_GUIDE.md` ### Quick Workflow -1. **Search existing keys first**: - ```bash - rg "yourSearchTerm" Modules/Loc/Sources/Loc/Generated/Strings.swift - ``` +1. Search existing: `rg "yourSearchTerm" Modules/Loc/Sources/Loc/Generated/Strings.swift` +2. Choose file: Auth (86 keys), Workspace (493 keys), or UI (667 keys) +3. Add to appropriate `.xcstrings` file if missing +4. Run: `make generate` +5. Use: `Loc.yourKey` or `AnytypeText(Loc.yourKey, style: .uxBodyRegular)` -2. **Use existing patterns**: - - Block titles: `[feature]BlockTitle` - - Block subtitles: `[feature]BlockSubtitle` - - Common words: `camera`, `photo`, `picture`, `video(1)` - -3. **Choosing the Right File**: - Localization is split into 3 files - select based on your feature: - - **Auth.xcstrings** (86 keys): Authentication, login/join flows, keychain, vault, onboarding, migration - - **Workspace.xcstrings** (493 keys): Spaces, objects, relations, collections, sets, types, templates, collaboration - - **UI.xcstrings** (667 keys): Settings, widgets, alerts, common UI elements, general app strings - - **âš ī¸ CRITICAL**: Keys must be unique across ALL three files. Duplicate keys will break code generation. - -4. **Only if key doesn't exist**, add to the appropriate file in `Modules/Loc/Sources/Loc/Resources/`: - ```json - "Your localization key" : { - "extractionState" : "manual", - "localizations" : { - "en" : { - "stringUnit" : { - "state" : "translated", - "value" : "Your English text here" - } - } - } - } - ``` +### Critical Rules +- ❌ Never use hardcoded strings +- ❌ Never use `String(format: Loc.key, value)` → ✅ Use `Loc.key(value)` +- âš ī¸ Keys must be unique across ALL 3 .xcstrings files +- âš ī¸ Only edit English (`en`) - Crowdin handles other languages - **âš ī¸ IMPORTANT**: When adding or updating localization strings: - - **Only update the English (`en`) translation** - All other language translations are handled automatically via Crowdin - - Do not manually edit translations for other languages (de, es, fr, ja, etc.) - - The localization team manages non-English translations through Crowdin workflow +## 🎨 Design System (Quick Reference) -5. **Generate and use**: - ```bash - make generate - ``` - ```swift - import Loc - AnytypeText(Loc.yourLocalizationKey, style: .uxCalloutMedium) - ``` +**Full Guides**: +- `Anytype/Sources/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md` +- `Anytype/Sources/PresentationLayer/Common/TYPOGRAPHY_MAPPING.md` -### Key Patterns -- **Naming**: Use short, descriptive keys → `"No properties yet"` ✅, `"No properties yet. Add some to this type."` ❌ -- **Hierarchical**: Use dots for organization → `"QR.join.title"` creates `Loc.Qr.Join.title` -- **Generated file**: All 3 localization files (Auth, Workspace, UI) generate into a single `Strings.swift` file (~5,000 lines). Use `rg` for searching -- **Always import**: `import Loc` when using localization +### Icons +Icons organized by size (x18, x24, x32, x40): +```swift +Image(asset: .X32.qrCode) // 32pt icon +Image(asset: .X24.search) // 24pt icon +``` -### Dynamic Localization (with Parameters) +**Adding**: Export SVG from Figma → Add to Assets.xcassets → `make generate` → Use constant -**✅ CORRECT** - Generated function with parameters: +### Typography +Figma styles map to Swift constants: ```swift -// For string: "You've reached the limit of %lld editors" -Loc.SpaceLimit.Editors.title(4) // Proper way - -// For string: "Pin limit reached: %d pinned spaces" -Loc.pinLimitReached(10) // Proper way +AnytypeText("Title", style: .uxTitle1Semibold) // Screen titles +AnytypeText("Body", style: .bodyRegular) // Body text ``` -**❌ WRONG** - Never use String(format:): +### Colors +Always use design system constants: ```swift -String(format: Loc.SpaceLimit.Editors.title, 4) // DON'T DO THIS -String(format: Loc.pinLimitReached, 10) // DON'T DO THIS +.foregroundColor(Color.Text.primary) +.background(Color.Shape.transperentSecondary) ``` -**Why**: SwiftGen automatically generates parameterized functions for strings with format specifiers (%lld, %d, %@). Always use the generated function directly. - -### Removing Unused Localization Keys +## 🔧 Code Generation (Quick Reference) -When removing code that uses localization keys, **always check if the key is still used elsewhere**: +**Full Guide**: `Modules/AnytypeCore/CODE_GENERATION_GUIDE.md` -1. **Search for usage**: - ```bash - rg "keyName" --type swift - ``` - -2. **If only found in Generated/Strings.swift**, the key is unused: - - Remove the entire key entry from the source `.xcstrings` file - - Run `make generate` to regenerate Strings.swift - -3. **Example workflow**: - - Removed `MembershipParticipantUpgradeReason.numberOfSpaceReaders` - - Search: `rg "noMoreMembers" --type swift` → only in Strings.swift - - Remove `"Membership.Upgrade.NoMoreMembers"` from Workspace.xcstrings - - Run `make generate` - -**Important**: Never leave orphaned localization keys in .xcstrings files - they bloat the codebase and confuse translators. - -## 🎨 Design System & Common UI Components - -### Quick Reference -- **Search Patterns**: `/PresentationLayer/Common/SwiftUI/Search/SEARCH_PATTERNS.md` -- **Design System Mapping**: `/PresentationLayer/Common/DESIGN_SYSTEM_MAPPING.md` -- **Analytics Patterns**: `/PresentationLayer/Common/Analytics/ANALYTICS_PATTERNS.md` - -### Icons -Icons are code-generated from assets organized by size (x18, x24, x32, x40). - -**Usage**: -```swift -Image(asset: .X32.qrCode) // 32pt QR code icon -Image(asset: .X24.search) // 24pt search icon +### Quick Workflow +```bash +make generate # After adding flags, assets, or localization +make generate-middle # After middleware/protobuf changes ``` -**Adding new icons**: -1. Export SVG from Figma ("32/qr code" format) -2. Add to `/Modules/Assets/.../Assets.xcassets/DesignSystem/x32/QRCode.imageset/` -3. Run `make generate` -4. Use: `Image(asset: .X32.qrCode)` - ### Feature Flags -Wrap new features in boolean toggles for safe rollouts. - -**Adding**: -1. Edit `/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift`: - ```swift - static let yourFeatureName = FeatureDescription( - title: "Your Feature Name", - type: .feature(author: "Your Name", releaseVersion: "X.X.X"), - defaultValue: false, - debugValue: true - ) - ``` +1. Add to `/Modules/AnytypeCore/.../FeatureDescription+Flags.swift` +2. Run `make generate` +3. Use: `if FeatureFlags.yourFlag { ... }` -2. Generate: `make generate` +### Tools +- **SwiftGen**: Assets & localization → type-safe constants +- **Sourcery**: Swift code from templates → boilerplate reduction +- **Protobuf**: Middleware message generation -3. Use: - ```swift - import AnytypeCore - - if FeatureFlags.yourFeatureName { - // Your feature code - } - ``` - -**Types**: `.debug` (debug-only), `.feature(author:releaseVersion:)` (production) +## đŸ—ī¸ Architecture (High-Level) -## đŸ—ī¸ Architecture +**Full Guide**: `Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md` ### Technologies - **Swift & SwiftUI** - Primary language and UI framework - **Combine** - Reactive programming - **Factory** - Dependency injection -- **Middleware** - Custom binary framework for core functionality -- **Protobuf** - Middleware communication +- **Middleware** - Custom binary framework (Protobuf communication) -### Structure +### Project Structure ``` Anytype/Sources/ ├── ApplicationLayer/ # App lifecycle, coordinators ├── PresentationLayer/ # UI components, ViewModels ├── ServiceLayer/ # Business logic, data services ├── Models/ # Data models, entities -├── CoreLayer/ # Core utilities, networking -└── DesignSystem/ # Reusable UI components +└── CoreLayer/ # Core utilities, networking Modules/ # Swift packages -├── Services/ # Core services -├── AnytypeCore/ # Core utilities -├── ProtobufMessages/ # Generated protobuf code -└── ... +├── AnytypeCore/ # Core utilities, feature flags +├── Loc/ # Localization +├── Assets/ # Design assets +└── Services/ # Core services ``` ### Key Patterns -- **MVVM**: ViewModels handle business logic for SwiftUI views +- **MVVM**: ViewModels handle business logic, Views are lightweight - **Coordinator**: Navigation handled by coordinators - **Repository**: Data access abstracted through services -- **Protocol-Oriented**: Heavy use of protocols for testability -- **Dependency Injection**: Factory pattern in `ServiceLayer/ServicesDI.swift` +- **Dependency Injection**: Factory pattern with `@Injected` + +## 🔧 Code Style (Quick Reference) -## 🔧 Code Style +**Full Guide**: `Anytype/Sources/IOS_DEVELOPMENT_GUIDE.md` ### Formatting - 4 spaces indentation (no tabs) - K&R style (opening brackets on same line) - 120-140 character lines -- One blank line between functions, two between sections +- **NEVER trim whitespace-only lines** - Preserve blank lines with spaces/tabs exactly ### Naming - **PascalCase**: Classes, Structs, Protocols (`ChatViewModel`) - **camelCase**: Variables, Functions (`objectDetails`, `updateRows()`) - **Extensions**: `TypeName+Feature.swift` -- **Protocols**: Often suffixed with `Protocol` ### Swift Best Practices -- Prefer `guard` for early returns - Use `@MainActor` for UI classes -- Import order: system → third-party → internal -- Property organization: @Published/@Injected → public → private → constants → variables → methods -- Use async/await, SwiftUI property wrappers, trailing closures, type inference -- **Avoid nested types** - Extract enums/structs to top-level with descriptive names (e.g., `SpaceLimitBannerLimitType` instead of `SpaceLimitBannerView.LimitType`) -- **Enum exhaustiveness**: Always use explicit switch statements for enum pattern matching to enable compiler warnings when new cases are added - - ✅ **CORRECT**: - ```swift - var showManageButton: Bool { - switch self { - case .sharedSpaces: - return true - case .editors: - return false - } - } - ``` - - ❌ **WRONG**: - ```swift - var showManageButton: Bool { - if case .sharedSpaces = self { return true } - return false // Default fallback prevents compiler warnings - } - ``` - - **Exception**: Only use default fallback for super obvious single-case checks (e.g., `isSharedSpaces`, `isEditor`) +- Prefer `guard` for early returns +- Use async/await over completion handlers +- Avoid nested types (extract to top-level) +- Use explicit switch for enums (enables compiler warnings) ## 🔄 Development Workflow ### 🚨 Pre-Commit Checklist -**STOP** before EVERY commit and verify: +**ONLY WHEN USER EXPLICITLY ASKS YOU TO STAGE OR COMMIT** - STOP and verify: +- [ ] User has explicitly requested staging files (`git add`) or committing +- [ ] User has explicitly requested a commit - [ ] NO "Co-Authored-By: Claude" in commit message - [ ] NO "Generated with Claude" or similar AI signatures - [ ] NO emoji signatures like 🤖 @@ -291,54 +277,49 @@ Modules/ # Swift packages **âš ī¸ CRITICAL: This is the FIRST thing to do when starting any task** When receiving a Linear task ID (e.g., `IOS-5292`): -1. **Identify the task branch**: The branch name follows the format `ios-XXXX-description` - - Example: `ios-5292-update-space-hub-loading-state` - - You can retrieve the branch name from Linear issue details +1. **Fetch the Linear issue**: Use `mcp__linear__list_issues` with the task ID to get issue details +2. **Get the branch name**: Extract `gitBranchName` field from the Linear issue (format: `ios-XXXX-description`) +3. **Switch to the task branch IMMEDIATELY**: `git checkout ios-5292-update-space-hub-loading-state` -2. **Switch to the task branch IMMEDIATELY** before doing ANY other work: - ```bash - git checkout ios-5292-update-space-hub-loading-state - ``` +**All work for the task must be done in this dedicated branch** -3. **All work for the task must be done in this dedicated branch** - - Never work on tasks in the wrong branch - - Verify you're on the correct branch: `git branch --show-current` +**Example**: +```bash +# Fetch issue details +mcp__linear__list_issues(query: "IOS-5292", limit: 1) +# Response includes: "gitBranchName": "ios-5292-update-space-hub-loading-state" + +# Use the exact branch name from Linear +git checkout ios-5292-update-space-hub-loading-state +``` ### Git & GitHub - **Main branch**: `develop` - **Feature branches**: `ios-XXXX-description` -- **Commit messages**: - - Single line only - - **NO AI signatures** (no "Generated with Claude", no co-author attribution) - - Professional and concise +- **âš ī¸ CRITICAL: NEVER commit without explicit user request** +- **Commit messages**: Single line, no AI signatures - **GitHub CLI**: Use `gh` tool for all GitHub operations - `gh pr view --repo anyproto/anytype-swift` - `gh pr diff --repo anyproto/anytype-swift` +### GitHub Workflows & Actions +For comprehensive documentation on GitHub workflows, actions, and automation (including auto-merge behavior), see `.github/WORKFLOWS_REFERENCE.md` + ### Release Branch Workflow -- **Branches from release**: When creating a branch from a release branch (e.g., `release/0.42.0`): - - Target the **release branch** in your PR, not `develop` - - Always add the **"Release"** label to the PR - - Example: `gh pr create --base release/0.42.0 --label "Release" --title "..." --body "..."` +When creating a branch from a release branch (e.g., `release/0.42.0`): +- Target the **release branch** in your PR, not `develop` +- Always add the **"Release"** label to the PR +- Example: `gh pr create --base release/0.42.0 --label "Release" --title "..." --body "..."` ### ❌ FORBIDDEN Git Practices -**NEVER do this:** -```bash -# ❌ WRONG - Contains AI attribution -git commit -m "Fix pinned spaces limit - -Co-Authored-By: Claude " - -# ❌ WRONG - Contains AI signature -git commit -m "Add feature 🤖 Generated with Claude Code" -``` +**ABSOLUTELY NEVER run destructive git operations** unless you have explicit, written approval: +- `git reset --hard` - Discards all local changes permanently +- `git checkout ` or `git restore` to revert to older commits +- `git clean -fd` - Removes untracked files permanently +- `git push --force` to main/develop - Rewrites shared history -**ALWAYS do this:** -```bash -# ✅ CORRECT - Clean, professional, single line -git commit -m "IOS-4852 Add limit check for pinned spaces" -``` +**If you are even slightly unsure about a git command, STOP and ask the user first.** ### Pull Requests **Format**: @@ -349,65 +330,53 @@ git commit -m "IOS-4852 Add limit check for pinned spaces" **Note**: PRs are for programmers, not testers - **NO test plan needed** -**IMPORTANT**: +**IMPORTANT**: - **NEVER add AI signatures** like "🤖 Generated with Claude Code" to pull requests -- **NEVER add AI signatures** to commit messages - Keep commits and PRs professional without AI attribution **Incremental Strategy** (for related changes): - Sequential branches: `ios-XXXX-description-1`, `ios-XXXX-description-2` - Chain PRs: `branch-1` → `develop`, `branch-2` → `branch-1` -- Atomic changes per branch + +### 🔧 Git Technical Tips + +**Quoting paths with special characters**: +Always quote git paths containing brackets, parentheses, or spaces: +```bash +# ✅ CORRECT +git add "Anytype/Sources/[Feature]/Component.swift" + +# ❌ WRONG - Shell interprets brackets as glob +git add Anytype/Sources/[Feature]/Component.swift +``` ### Linear Integration -1. **Get task context**: Extract task number from branch name or ask user -2. **Fetch details**: Use Linear MCP tools (`mcp__linear__get_issue`) -3. **Check PRs**: Use `gh` tool to examine related PRs -4. **Update progress**: Add comments and check off completed items - -## đŸ› ī¸ Code Generation - -### Tools & Locations -- **SwiftGen**: Assets, localization strings (`/Modules/*/swiftgen.yml`) -- **Sourcery**: Swift code from templates (`/Modules/*/sourcery.yml`) -- **Custom**: Protobuf splitting (`anytypeGen.yml`) - -### Important Notes -- Generated files marked with `// Generated using Sourcery/SwiftGen` -- Never edit generated files directly -- Update source templates/configurations instead -- Always run `make generate` after template changes - -## 📚 Common Tasks - -### Adding Features -1. Create models in `Models/` (if needed) -2. Add service logic in `ServiceLayer/` -3. Create ViewModel in `PresentationLayer/` -4. Build UI with SwiftUI -5. Add tests in `AnyTypeTests/` -6. Wrap in feature flags - -### Working with Middleware -- Pre-compiled binary framework -- Communication via Protobuf messages -- Message definitions in `Modules/ProtobufMessages/` +- **Branch management**: See "Task-Based Branching" section above for fetching branch names from Linear +- **Get task context**: Extract task ID from user request or current branch name +- **Check PRs**: Use `gh` tool to examine related PRs +- **Update progress**: Add comments and check off completed items using Linear MCP tools ## 📋 Memories & Tips - For trivial PRs, add GitHub label "🧠 No brainer" (not in title) - Use `rg` for searching large files -- Check existing keys before adding new localization - Feature flags for all new features -- **NO need to import `Loc` manually** - it's pre-imported by default in shared header +- **NO need to import `Loc` manually** - it's pre-imported by default - Import `AnytypeCore` for feature flags -### âš ī¸ Common Mistakes to Avoid +## âš ī¸ Common Mistakes to Avoid + +### Git Operations +**Autonomous Committing (2025-01-28):** Committed changes without explicit user request. NEVER commit unless user explicitly asks. This is a CRITICAL rule. -#### File Operations & Architecture -**Wildcard File Deletion (2025-01-24):** Used `rm -f .../PublishingPreview*.swift` - accidentally deleted main UI component. Always check with `ls` first, remove files individually, keep UI in PresentationLayer. +### File Operations & Architecture +**Wildcard File Deletion (2025-01-24):** Used `rm -f .../PublishingPreview*.swift` - accidentally deleted main UI component. Always check with `ls` first, remove files individually. -#### Refactoring & Testing -**Incomplete Mock Updates (2025-01-16):** Refactored `spaceViewStorage` → `spaceViewsStorage` and `participantSpaceStorage` → `participantSpacesStorage` in production code, but forgot to update `MockView.swift` causing test failures. When renaming dependencies: -1. Search for old names across entire codebase: `rg "oldName" --type swift` +### Refactoring & Testing +**Incomplete Mock Updates (2025-01-16):** Refactored properties in production code but forgot to update `MockView.swift` causing test failures. When renaming dependencies: +1. Search for old names: `rg "oldName" --type swift` 2. Update all references in tests, mocks, and DI registrations -3. Run unit tests to verify: `xcodebuild -scheme Anytype -destination 'platform=iOS Simulator,name=iPhone 15' build-for-testing` \ No newline at end of file +3. Report changes to user for compilation verification + +--- + +**Remember**: This file provides quick reference and overview. For detailed guidance, see the specialized documentation guides linked above. \ No newline at end of file diff --git a/Gemfile b/Gemfile index 5f0f58bdee..a41a86c820 100644 --- a/Gemfile +++ b/Gemfile @@ -2,7 +2,7 @@ ruby '2.7.2' source 'https://rubygems.org' -gem 'fastlane', '~> 2.224.0' +gem 'fastlane', '~> 2.229.0' gem 'fastlane-plugin-sentry', '1.15.0' gem 'license_finder' # https://github.com/CocoaPods/Xcodeproj/pull/942 diff --git a/Gemfile.lock b/Gemfile.lock index 65597f01f6..2532324c99 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -14,29 +14,30 @@ GIT GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.7) - base64 - nkf - rexml - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) + CFPropertyList (3.0.9) + abbrev (0.1.2) + addressable (2.8.8) + public_suffix (>= 2.0.2, < 8.0) artifactory (3.0.17) atomos (0.1.3) - aws-eventstream (1.3.0) - aws-partitions (1.985.0) - aws-sdk-core (3.209.1) + aws-eventstream (1.4.0) + aws-partitions (1.1187.0) + aws-sdk-core (3.239.1) aws-eventstream (~> 1, >= 1.3.0) - aws-partitions (~> 1, >= 1.651.0) + aws-partitions (~> 1, >= 1.992.0) aws-sigv4 (~> 1.9) + base64 + bigdecimal jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.94.0) - aws-sdk-core (~> 3, >= 3.207.0) + logger + aws-sdk-kms (1.118.0) + aws-sdk-core (~> 3, >= 3.239.1) aws-sigv4 (~> 1.5) - aws-sdk-s3 (1.167.0) - aws-sdk-core (~> 3, >= 3.207.0) + aws-sdk-s3 (1.205.0) + aws-sdk-core (~> 3, >= 3.234.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.5) - aws-sigv4 (1.10.0) + aws-sigv4 (1.12.1) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) badge (0.13.0) @@ -44,13 +45,15 @@ GEM fastlane (>= 2.0) mini_magick (>= 4.9.4, < 5.0.0) base64 (0.2.0) + bigdecimal (3.3.1) claide (1.1.0) colored (1.2) colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) + csv (3.3.5) declarative (0.0.20) - digest-crc (0.6.5) + digest-crc (0.7.0) rake (>= 12.0.0, < 14.0.0) domain_name (0.6.20240107) dotenv (2.8.1) @@ -68,15 +71,15 @@ GEM faraday-rack (~> 1.0) faraday-retry (~> 1.0) ruby2_keywords (>= 0.0.4) - faraday-cookie_jar (0.0.7) + faraday-cookie_jar (0.0.8) faraday (>= 0.8.0) - http-cookie (~> 1.0.0) + http-cookie (>= 1.0.0) faraday-em_http (1.0.0) - faraday-em_synchrony (1.0.0) + faraday-em_synchrony (1.0.1) faraday-excon (1.1.0) faraday-httpclient (1.0.1) - faraday-multipart (1.0.4) - multipart-post (~> 2) + faraday-multipart (1.1.1) + multipart-post (~> 2.0) faraday-net_http (1.0.2) faraday-net_http_persistent (1.2.0) faraday-patron (1.0.0) @@ -84,16 +87,19 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.1) faraday (~> 1.0) - fastimage (2.3.1) - fastlane (2.224.0) + fastimage (2.4.0) + fastlane (2.229.1) CFPropertyList (>= 2.3, < 4.0.0) + abbrev (~> 0.1.2) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) + base64 (~> 0.2.0) bundler (>= 1.12.0, < 3.0.0) colored (~> 1.2) commander (~> 4.6) + csv (~> 3.3) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) excon (>= 0.71.0, < 1.0.0) @@ -101,6 +107,7 @@ GEM faraday-cookie_jar (~> 0.0.6) faraday_middleware (~> 1.0) fastimage (>= 2.1.0, < 3.0.0) + fastlane-sirp (>= 1.0.0) gh_inspector (>= 1.1.2, < 2.0.0) google-apis-androidpublisher_v3 (~> 0.3) google-apis-playcustomapp_v1 (~> 0.1) @@ -112,7 +119,9 @@ GEM jwt (>= 2.1.0, < 3) mini_magick (>= 4.9.4, < 5.0.0) multipart-post (>= 2.0.0, < 3.0.0) + mutex_m (~> 0.3.0) naturally (~> 2.2) + nkf (~> 0.2.0) optparse (>= 0.1.1, < 1.0.0) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) @@ -124,13 +133,15 @@ GEM tty-spinner (>= 0.8.0, < 1.0.0) word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) - xcpretty (~> 0.3.0) + xcpretty (~> 0.4.1) xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) fastlane-plugin-badge (1.5.0) badge (~> 0.13.0) fastlane-plugin-sentry (1.15.0) os (~> 1.1, >= 1.1.4) fastlane-plugin-versioning (0.6.0) + fastlane-sirp (1.0.0) + sysrandom (~> 1.0) gh_inspector (1.1.3) google-apis-androidpublisher_v3 (0.54.0) google-apis-core (>= 0.11.0, < 2.a) @@ -169,12 +180,13 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.7) + http-cookie (1.0.8) domain_name (~> 0.5) - httpclient (2.8.3) + httpclient (2.9.0) + mutex_m jmespath (1.6.2) - json (2.7.2) - jwt (2.9.3) + json (2.16.0) + jwt (2.10.2) base64 license_finder (7.1.0) bundler @@ -183,27 +195,29 @@ GEM tomlrb (>= 1.3, < 2.1) with_env (= 1.1.0) xml-simple (~> 1.1.9) + logger (1.7.0) mini_magick (4.13.2) mini_mime (1.1.5) multi_json (1.15.0) multipart-post (2.4.1) + mutex_m (0.3.0) nanaimo (0.3.0) - naturally (2.2.1) + naturally (2.3.0) nkf (0.2.0) - optparse (0.5.0) + optparse (0.8.0) os (1.1.4) - plist (3.7.1) + plist (3.7.2) public_suffix (5.1.1) - rake (13.2.1) + rake (13.3.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.3.8) - rouge (2.0.7) + rexml (3.4.4) + rouge (3.28.0) ruby2_keywords (0.0.5) - rubyzip (2.3.2) + rubyzip (2.4.1) security (0.1.5) signet (0.19.0) addressable (~> 2.8) @@ -213,6 +227,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + sysrandom (1.0.5) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -227,8 +242,8 @@ GEM unicode-display_width (2.6.0) with_env (1.1.0) word_wrap (1.0.0) - xcpretty (0.3.0) - rouge (~> 2.0.7) + xcpretty (0.4.1) + rouge (~> 3.28.0) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) xml-simple (1.1.9) @@ -240,7 +255,7 @@ PLATFORMS x86_64-darwin-19 DEPENDENCIES - fastlane (~> 2.224.0) + fastlane (~> 2.229.0) fastlane-plugin-badge fastlane-plugin-sentry (= 1.15.0) fastlane-plugin-versioning diff --git a/Libraryfile b/Libraryfile index 5c40ad9372..102d6ba280 100644 --- a/Libraryfile +++ b/Libraryfile @@ -1 +1 @@ -MIDDLE_VERSION=v0.45.0-rc03 \ No newline at end of file +MIDDLE_VERSION=v0.45.5 \ No newline at end of file diff --git a/Makefile b/Makefile index 6e70b21a59..ea18aa0ecb 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,7 @@ FILE_SPLITTER = ./build/anytype-swift-filesplit-v1 +BOLD := \033[1m +GREEN := \033[32m +RESET := \033[0m setup-middle: ./Scripts/middle-download.sh @@ -12,18 +15,15 @@ change-github-token: # https://github.com/anyproto/anytype-swift?tab=readme-ov-file#use-pre-built-anytype-heart ./Scripts/change-token.sh -generate-middle: setup-tools - rm -rf Modules/ProtobufMessages/Sources/Protocol/* - $(FILE_SPLITTER) --path ./Dependencies/Middleware/protobuf/commands.pb.swift --output-dir ./Modules/ProtobufMessages/Sources/Protocol/Commands --other-name CommandsOther.swift - $(FILE_SPLITTER) --path ./Dependencies/Middleware/protobuf/events.pb.swift --output-dir ./Modules/ProtobufMessages/Sources/Protocol/Events --other-name EventsOther.swift - $(FILE_SPLITTER) --path ./Dependencies/Middleware/protobuf/models.pb.swift --output-dir ./Modules/ProtobufMessages/Sources/Protocol/Models --other-name ModelsOther.swift --max-depth 4 - cp -r Dependencies/Middleware/protobuf/localstore.pb.swift Modules/ProtobufMessages/Sources/Protocol +generate-middle: + @echo "$(BOLD)If you encounter issues with generation, run $(GREEN)setup-env$(RESET)" + ./Modules/ProtobufMessages/Scripts/generate.sh ./build/sourcery --config ./Modules/ProtobufMessages/sourcery.yml ./Tools/anytype-swift-codegen --yaml-path ./Modules/ProtobufMessages/anytypeGen.yml --project-dir ./Modules/ProtobufMessages --output-dir ./Modules/ProtobufMessages/Sources/Generated ./build/swiftgen --config ./Modules/Services/swiftgen.yml - ./Modules/ProtobufMessages/Scripts/generate.sh generate: + @echo "$(BOLD)If you encounter issues with generation, run $(GREEN)setup-env$(RESET)" # We also have code generation in XCode Build phases for main target and widgets ./build/sourcery --config ./Modules/AnytypeCore/sourcery.yml ./Modules/Assets/Scripts/generate.sh @@ -42,18 +42,27 @@ build-middle-local: setup-middle-local: build-middle-local install-middle-local -setup-env: +setup-env: setup-file-splitter + brew install protobuf ./Scripts/install-sourcery.sh + ./Scripts/install-swiftprotobuf.sh brew install ubi ubi --project "mgolovko/SwiftGen" --tag "6.6.4-alpha.0" --matching "swiftgen-6.6.4-alpha.0-macos.zip" --exe swiftgen --in ./build set-middle-version: echo "MIDDLE_VERSION=$(v)" > Libraryfile -setup-tools: +setup-file-splitter: @if [ ! -f "$(FILE_SPLITTER)" ]; then \ make release -C Tools/anytype-swift-filesplit; \ mkdir -p build; \ cp Tools/anytype-swift-filesplit/build/anytype-swift-filesplit $(FILE_SPLITTER); \ fi +generate_debug_profiles: + bundle exec fastlane generate_dev_debug_profiles + bundle exec fastlane generate_anytype_debug_profiles + +generate_appstore_profiles: + bundle exec fastlane generate_appstore_profiles_for_nightly + bundle exec fastlane generate_appstore_profiles_for_anytype diff --git a/Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags+Flags.swift b/Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags+Flags.swift index fffa4157f2..52910f7bbb 100644 --- a/Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags+Flags.swift +++ b/Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags+Flags.swift @@ -6,48 +6,24 @@ public extension FeatureFlags { // Static value reader - static var muteSpacePossibility: Bool { - value(for: .muteSpacePossibility) - } - - static var addNotificationsSettings: Bool { - value(for: .addNotificationsSettings) - } - - static var swipeToReply: Bool { - value(for: .swipeToReply) - } - - static var removeMessagesFromNotificationsCenter: Bool { - value(for: .removeMessagesFromNotificationsCenter) - } - - static var mediaCarouselForWidgets: Bool { - value(for: .mediaCarouselForWidgets) - } - - static var fixCollectionViewReuseCrashInEditor: Bool { - value(for: .fixCollectionViewReuseCrashInEditor) - } - - static var loadAttachmentsOnHomePlusMenu: Bool { - value(for: .loadAttachmentsOnHomePlusMenu) + static var showAllButtonInWidgets: Bool { + value(for: .showAllButtonInWidgets) } - static var vaultBackToRoots: Bool { - value(for: .vaultBackToRoots) + static var turnOffAutomaticWidgetOpening: Bool { + value(for: .turnOffAutomaticWidgetOpening) } - static var brandNewAuthFlow: Bool { - value(for: .brandNewAuthFlow) + static var channelTypeSwitcher: Bool { + value(for: .channelTypeSwitcher) } - static var showAllButtonInWidgets: Bool { - value(for: .showAllButtonInWidgets) + static var showUploadStatusIndicator: Bool { + value(for: .showUploadStatusIndicator) } - static var turnOffAutomaticWidgetOpening: Bool { - value(for: .turnOffAutomaticWidgetOpening) + static var newObjectSettings: Bool { + value(for: .newObjectSettings) } static var setKanbanView: Bool { @@ -62,14 +38,6 @@ public extension FeatureFlags { value(for: .dndOnCollectionsAndSets) } - static var multichats: Bool { - value(for: .multichats) - } - - static var doNotWaitCompletionInAnytypePreview: Bool { - value(for: .doNotWaitCompletionInAnytypePreview) - } - static var rainbowViews: Bool { value(for: .rainbowViews) } @@ -130,24 +98,24 @@ public extension FeatureFlags { value(for: .skipOnboardingEmailCollection) } + static var spaceHubAlwaysShowLoading: Bool { + value(for: .spaceHubAlwaysShowLoading) + } + + static var showHangedObjects: Bool { + value(for: .showHangedObjects) + } + // All toggles static let features: [FeatureDescription] = [ - .muteSpacePossibility, - .addNotificationsSettings, - .swipeToReply, - .removeMessagesFromNotificationsCenter, - .mediaCarouselForWidgets, - .fixCollectionViewReuseCrashInEditor, - .loadAttachmentsOnHomePlusMenu, - .vaultBackToRoots, - .brandNewAuthFlow, .showAllButtonInWidgets, .turnOffAutomaticWidgetOpening, + .channelTypeSwitcher, + .showUploadStatusIndicator, + .newObjectSettings, .setKanbanView, .fullInlineSetImpl, .dndOnCollectionsAndSets, - .multichats, - .doNotWaitCompletionInAnytypePreview, .rainbowViews, .showAlertOnAssert, .analytics, @@ -162,6 +130,8 @@ public extension FeatureFlags { .networkHTTPSRequestsLogger, .logMiddlewareRequests, .showPushMessagesInForeground, - .skipOnboardingEmailCollection + .skipOnboardingEmailCollection, + .spaceHubAlwaysShowLoading, + .showHangedObjects ] } diff --git a/Modules/AnytypeCore/AnytypeCore/Utils/CoreEnvironment.swift b/Modules/AnytypeCore/AnytypeCore/Utils/CoreEnvironment.swift index f53fb3f2c9..449898a8dc 100644 --- a/Modules/AnytypeCore/AnytypeCore/Utils/CoreEnvironment.swift +++ b/Modules/AnytypeCore/AnytypeCore/Utils/CoreEnvironment.swift @@ -43,8 +43,6 @@ public enum CoreEnvironment { switch condition { case "DEBUG", "RELEASE_NIGHTLY": resolved = .debug - case "RELEASE_ANYAPP": - resolved = .releaseAnyApp case "RELEASE_ANYTYPE": resolved = .releaseAnytype default: diff --git a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift index 623e51fe93..cadd9ae616 100644 --- a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift +++ b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift @@ -3,60 +3,6 @@ import Foundation // Call `make generate` to update FeatureFlags helper public extension FeatureDescription { - - static let muteSpacePossibility = FeatureDescription( - title: "Mute space possibility", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let addNotificationsSettings = FeatureDescription( - title: "Add notifications settings", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let swipeToReply = FeatureDescription( - title: "Swipe to reply in chats", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let removeMessagesFromNotificationsCenter = FeatureDescription( - title: "Remove messages from NotificationsCenter", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let mediaCarouselForWidgets = FeatureDescription( - title: "Media carousel for widgets", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let fixCollectionViewReuseCrashInEditor = FeatureDescription( - title: "Attempt to fix collection view reuse crash in Editor", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let loadAttachmentsOnHomePlusMenu = FeatureDescription( - title: "Possibility to load attachments on home + menu", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let vaultBackToRoots = FeatureDescription( - title: "New old design of vault cells", - type: .feature(author: "vova@anytype.io", releaseVersion: "13"), - defaultValue: true - ) - - static let brandNewAuthFlow = FeatureDescription( - title: "New auth flow", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "13"), - defaultValue: true - ) static let showAllButtonInWidgets = FeatureDescription( title: "See all as the last point in the widget - IOS-4945", @@ -69,7 +15,27 @@ public extension FeatureDescription { type: .feature(author: "m@anytype.io", releaseVersion: "13.5"), defaultValue: true ) + + // should be disabled + static let channelTypeSwitcher = FeatureDescription( + title: "Channel type switcher - IOS-5378", + type: .feature(author: "vova@anytype.io", releaseVersion: "14"), + defaultValue: false + ) + + static let showUploadStatusIndicator = FeatureDescription( + title: "Show visual indicator for uploading files - IOS-5054", + type: .feature(author: "vova@anytype.io", releaseVersion: "14"), + defaultValue: false + ) + static let newObjectSettings = FeatureDescription( + title: "New Object Settings", + type: .feature(author: "vova@anytype.io", releaseVersion: "15"), + defaultValue: false, + debugValue: true + ) + // MARK: - Experemental static let setKanbanView = FeatureDescription( @@ -92,20 +58,6 @@ public extension FeatureDescription { defaultValue: false ) - static let multichats = FeatureDescription( - title: "Multichats", - type: .feature(author: "m@anytype.io", releaseVersion: "?"), - defaultValue: false, - debugValue: true - ) - - static let doNotWaitCompletionInAnytypePreview = FeatureDescription( - title: "Do not wait completion in Anytype Preview", - type: .feature(author: "joe_pusya@anytype.io", releaseVersion: "?"), - defaultValue: false, - debugValue: false - ) - // MARK: - Debug static let rainbowViews = FeatureDescription( @@ -213,4 +165,16 @@ public extension FeatureDescription { defaultValue: false, debugValue: true ) + static let spaceHubAlwaysShowLoading = FeatureDescription( + title: "Space Hub - Always show loading", + type: .debug, + defaultValue: false + ) + + static let showHangedObjects = FeatureDescription( + title: "Show hanged objects", + type: .debug, + defaultValue: false, + debugValue: true + ) } diff --git a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription.swift b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription.swift index 8d44f385aa..971462442f 100644 --- a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription.swift +++ b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription.swift @@ -27,14 +27,12 @@ public struct FeatureDescription: Sendable { public let title: String public let type: FeatureType public let releaseAnytypeValue: Bool - public let releaseAnyAppValue: Bool public let debugValue: Bool - init(title: String, type: FeatureType, releaseAnytypeValue: Bool, releaseAnyAppValue: Bool, debugValue: Bool = true) { + init(title: String, type: FeatureType, releaseAnytypeValue: Bool, debugValue: Bool = true) { self.title = title self.type = type self.releaseAnytypeValue = releaseAnytypeValue - self.releaseAnyAppValue = releaseAnyAppValue self.debugValue = debugValue } @@ -42,7 +40,6 @@ public struct FeatureDescription: Sendable { self.title = title self.type = type self.releaseAnytypeValue = defaultValue - self.releaseAnyAppValue = defaultValue self.debugValue = debugValue } } diff --git a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureFlags.swift b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureFlags.swift index 92370a5d58..9b55fcf6ea 100644 --- a/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureFlags.swift +++ b/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureFlags.swift @@ -16,8 +16,6 @@ public final class FeatureFlags { switch CoreEnvironment.targetType { case .debug: defaultValue = feature.debugValue - case .releaseAnyApp: - defaultValue = feature.releaseAnyAppValue case .releaseAnytype: defaultValue = feature.releaseAnytypeValue } diff --git a/Modules/AnytypeCore/AnytypeCore/Utils/TargetsConstants.swift b/Modules/AnytypeCore/AnytypeCore/Utils/TargetsConstants.swift index 3bc956ca62..f2c1627169 100644 --- a/Modules/AnytypeCore/AnytypeCore/Utils/TargetsConstants.swift +++ b/Modules/AnytypeCore/AnytypeCore/Utils/TargetsConstants.swift @@ -5,8 +5,6 @@ public struct TargetsConstants { return "group.io.anytype.app.dev" case .releaseAnytype: return "group.io.anytype.app" - case .releaseAnyApp: - return "group.org.any.app" } } } diff --git a/Modules/AnytypeCore/CODE_GENERATION_GUIDE.md b/Modules/AnytypeCore/CODE_GENERATION_GUIDE.md new file mode 100644 index 0000000000..65aa2539f6 --- /dev/null +++ b/Modules/AnytypeCore/CODE_GENERATION_GUIDE.md @@ -0,0 +1,407 @@ +# Code Generation Guide + +Complete guide to code generation workflows in the Anytype iOS app: SwiftGen, Sourcery, Feature Flags, and Protobuf. + +*Last updated: 2025-01-30* + +## Overview + +The Anytype iOS app uses multiple code generation tools to reduce boilerplate and ensure type safety: + +- **SwiftGen**: Generates constants for assets (icons, colors) and localization strings +- **Sourcery**: Generates Swift code from templates based on source file annotations +- **Feature Flags**: Boolean toggles for safe feature rollouts (Sourcery-generated) +- **Protobuf**: Middleware message definitions + +## âš ī¸ CRITICAL RULES + +1. **NEVER edit generated files** - Files marked with `// Generated using Sourcery/SwiftGen` are auto-generated +2. **ALWAYS run `make generate` after changes** - Updates templates, flags, assets, or localization +3. **Feature flags for all new features** - Wrap experimental features for safe rollouts +4. **Update source, not generated code** - Edit templates/configurations, then regenerate + +## 📋 Essential Commands + +```bash +make generate # Run all generators (SwiftGen, Sourcery, assets, localization) +make generate-middle # Regenerate middleware and protobuf (when dependencies change) +make setup-middle # Initial middleware setup +``` + +### When to Run `make generate` + +| You Did This | Run This | Why | +|--------------|----------|-----| +| Added/updated .xcstrings | `make generate` | Regenerate Loc constants | +| Added feature flag | `make generate` | Generate FeatureFlags enum | +| Added icon to Assets.xcassets | `make generate` | Generate Image asset constants | +| Modified Sourcery template | `make generate` | Regenerate code from templates | +| Updated middleware version | `make generate-middle` | Regenerate protobuf bindings | + +## 🚩 Feature Flags System + +Feature flags enable safe rollout of new features by wrapping them in boolean toggles. + +### Quick Workflow + +**1. Define the flag** in `/Modules/AnytypeCore/AnytypeCore/Utils/FeatureFlags/FeatureDescription+Flags.swift`: + +```swift +extension FeatureDescription { + static let newChatInterface = FeatureDescription( + title: "New Chat Interface", + type: .feature(author: "Your Name", releaseVersion: "0.42.0"), + defaultValue: false, // Off in production + debugValue: true // On in debug builds for testing + ) +} +``` + +**2. Generate**: + +```bash +make generate +``` + +This generates `Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags.swift`: + +```swift +// Generated using Sourcery +enum FeatureFlags { + static let newChatInterface: Bool = /* value based on build config */ +} +``` + +**3. Use in code**: + +```swift +import AnytypeCore + +if FeatureFlags.newChatInterface { + NewChatView() +} else { + LegacyChatView() +} +``` + +### Feature Flag Types + +```swift +// Debug-only (not available in production builds) +type: .debug + +// Production feature with metadata +type: .feature(author: "Dev Name", releaseVersion: "0.42.0") +``` + +### Best Practices + +✅ **DO**: +- Set `defaultValue: false` for unreleased features +- Set `debugValue: true` for easier developer testing +- Include author and release version metadata +- Remove flags after feature is fully rolled out + +❌ **DON'T**: +- Deploy features without feature flags +- Forget to run `make generate` after adding flags +- Leave old flags in codebase indefinitely + +### Feature Flag Lifecycle + +**1. Development** (defaultValue: false, debugValue: true) +- Flag off in production +- Flag on in debug builds for testing + +**2. Beta** (defaultValue: false, debugValue: true) +- Still off in production +- Enable for beta testers via remote config (if available) + +**3. Rollout** (defaultValue: true, debugValue: true) +- Change defaultValue to true +- Deploy - feature now enabled for all users + +**4. Cleanup** +- Feature stable and enabled everywhere +- Remove FeatureDescription +- Remove all `if FeatureFlags.x` checks +- Make new behavior the default +- Run `make generate` + +## 🎨 SwiftGen - Assets & Localization + +SwiftGen generates type-safe constants for resources. + +### Configuration Files + +- Assets: `/Modules/Assets/swiftgen.yml` +- Localization: `/Modules/Loc/swiftgen.yml` + +### Icon Generation + +**Input** (Assets.xcassets): +``` +DesignSystem/ +└── x32/ + └── QRCode.imageset/ + ├── QRCode.svg + └── Contents.json +``` + +**Generated** (after `make generate`): +```swift +enum ImageAsset { + enum X32 { + static let qrCode = ImageAsset(name: "DesignSystem/x32/QRCode") + } +} +``` + +**Usage**: +```swift +Image(asset: .X32.qrCode) +``` + +### Adding Icons + +1. Export SVG from Figma (e.g., "32/qr code" → `QRCode.svg`) +2. Add to `/Modules/Assets/.../Assets.xcassets/DesignSystem/x32/QRCode.imageset/` +3. Run `make generate` +4. Use: `Image(asset: .X32.qrCode)` + +**Icon Sizes**: +- `x18` - 18pt icons (small UI) +- `x24` - 24pt icons (medium UI) +- `x32` - 32pt icons (large UI, most common) +- `x40` - 40pt icons (extra large) + +### Localization Generation + +SwiftGen also generates constants for localization keys from .xcstrings files. + +**See**: `LOCALIZATION_GUIDE.md` for complete localization workflow. + +## 🔧 Sourcery - Template-Based Generation + +Sourcery generates Swift code from templates based on source file annotations. + +### Configuration + +Multiple `sourcery.yml` files across modules: +- `/Modules/AnytypeCore/sourcery.yml` +- `/Modules/Services/sourcery.yml` +- etc. + +### Generated File Markers + +All Sourcery-generated files include: +```swift +// Generated using Sourcery X.X.X — https://github.com/krzysztofzablocki/Sourcery +// DO NOT EDIT +``` + +### Common Use Cases + +**1. Protocol conformance** (Equatable, Hashable) +```swift +// sourcery: AutoEquatable +struct User { + let id: String + let name: String +} + +// After make generate: +// User conforms to Equatable automatically +``` + +**2. Mock implementations for testing** +```swift +// sourcery: AutoMockable +protocol UserService { + func fetchUser(id: String) async throws -> User +} + +// After make generate: +// UserServiceMock class created automatically +``` + +**3. Enum helpers** +```swift +// sourcery: AutoCases +enum UserRole { + case admin, editor, viewer +} + +// After make generate: +// CaseIterable conformance added +``` + +### Workflow + +1. Add annotation to source file: `// sourcery: AutoEquatable` +2. Run: `make generate` +3. Sourcery scans files, applies templates, generates code +4. Use generated code (don't edit generated files!) + +### Important + +✅ Update source file annotations, not generated files +✅ Run `make generate` after changing templates +✅ Commit both source and generated files to git + +❌ Don't manually edit generated files +❌ Don't ignore "DO NOT EDIT" warnings + +## 🔌 Middleware & Protobuf + +The Anytype middleware is a pre-compiled binary framework communicating via Protobuf. + +### Commands + +```bash +make setup-middle # Initial setup (downloads middleware) +make generate-middle # Regenerate middleware + protobuf bindings +``` + +### When to Regenerate + +- Middleware version updated in dependencies +- `Dependencies/Middleware/Lib.xcframework` missing binaries +- Protobuf message definitions changed +- Build errors related to middleware symbols + +### Locations + +- **Middleware**: `Dependencies/Middleware/Lib.xcframework` +- **Protobuf messages**: `Modules/ProtobufMessages/` +- **Generated code**: `Modules/ProtobufMessages/Generated/` +- **Custom config**: `anytypeGen.yml` (protobuf splitting) + +## 📁 Generated File Locations + +| Generator | Output Location | +|-----------|-----------------| +| SwiftGen (Localization) | `Modules/Loc/Sources/Loc/Generated/Strings.swift` | +| SwiftGen (Assets) | `Modules/Assets/Generated/ImageAssets.swift` | +| SwiftGen (Colors) | `Modules/Assets/Sources/Assets/Generated/Color+Assets.swift` | +| Sourcery (Feature Flags) | `Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags.swift` | +| Sourcery (Various) | `Modules/*/Generated/` | +| Protobuf | `Modules/ProtobufMessages/Generated/` | + +## 🚨 Common Mistakes + +### ❌ Editing Generated Files + +```swift +// In Generated/FeatureFlags.swift +static let myFlag: Bool = true // ❌ Don't edit this! +// Your changes will be overwritten on next make generate +``` + +**✅ Correct**: Edit source file (`FeatureDescription+Flags.swift`), then regenerate. + +### ❌ Forgetting to Generate + +```swift +// Added FeatureDescription but didn't generate +if FeatureFlags.myNewFlag { // ❌ Error: unresolved identifier + ... +} +``` + +**✅ Correct**: Run `make generate` first. + +### ❌ Not Committing Generated Files + +Generated files should be committed to git for reproducibility: + +```bash +git add Modules/AnytypeCore/AnytypeCore/Generated/FeatureFlags.swift +git commit -m "Add new feature flag" +``` + +## 🔍 Troubleshooting + +### Issue: `make generate` fails + +**Common causes**: +- Malformed JSON in .xcstrings files +- Duplicate keys across localization files +- Invalid Sourcery annotations +- Syntax errors in templates + +**Solution**: +```bash +# Validate JSON +jq . Modules/Loc/Sources/Loc/Resources/UI.xcstrings + +# Check for duplicate localization keys +rg "\"My Key\"" Modules/Loc/Sources/Loc/Resources/*.xcstrings | wc -l +# Should be 1, not 2+ + +# Check Sourcery annotations +rg "// sourcery:" --type swift +``` + +### Issue: Generated constant not found + +**Symptom**: `FeatureFlags.myFlag` doesn't exist after adding FeatureDescription + +**Solution**: +1. Verify flag definition in `FeatureDescription+Flags.swift` +2. Run `make generate` +3. Check generated file: `rg "myFlag" Modules/AnytypeCore/AnytypeCore/Generated/` +4. Clean build if needed + +### Issue: Middleware binaries missing + +**Symptom**: Build error: "Lib.xcframework missing binaries" + +**Solution**: +```bash +make setup-middle # Initial setup +# Or +make generate # May trigger middleware generation +``` + +## 📚 Integration with Other Systems + +- **Localization**: See `LOCALIZATION_GUIDE.md` for complete `.xcstrings` workflow +- **Design System**: Icons generated by SwiftGen after adding to Assets.xcassets +- **iOS Development**: Generated code follows patterns in `IOS_DEVELOPMENT_GUIDE.md` + +## 💡 Best Practices + +1. **Run `make generate` frequently** - After any asset, localization, or flag changes +2. **Never edit generated files** - Always update source, then regenerate +3. **Commit generated files** - Ensures everyone has same code without requiring generators +4. **Use feature flags for new features** - Safe rollouts, easy rollback +5. **Keep flags temporary** - Remove after full rollout to avoid technical debt +6. **Check generated code into git** - Don't rely on everyone running generators + +## 📖 Quick Reference + +**Add feature flag**: +```bash +vim Modules/AnytypeCore/.../FeatureDescription+Flags.swift +make generate +# Use FeatureFlags.yourFlag in code +``` + +**Add icon**: +```bash +cp icon.svg Modules/Assets/.../x32/Icon.imageset/ +make generate +# Use Image(asset: .X32.icon) +``` + +**Add localization**: +```bash +# Edit .xcstrings file +make generate +# Use Loc.yourKey +``` + +--- + +*This guide is the single source of truth for code generation. For quick reference, see CLAUDE.md.* \ No newline at end of file diff --git a/Modules/AppTarget/Sources/AppTarget/AppTargetType.swift b/Modules/AppTarget/Sources/AppTarget/AppTargetType.swift index f639ec8ab5..5a6034b8e8 100644 --- a/Modules/AppTarget/Sources/AppTarget/AppTargetType.swift +++ b/Modules/AppTarget/Sources/AppTarget/AppTargetType.swift @@ -2,7 +2,6 @@ public enum AppTargetType: Sendable { case debug case releaseAnytype - case releaseAnyApp } public extension AppTargetType { @@ -15,9 +14,4 @@ public extension AppTargetType { if case .releaseAnytype = self { return true } return false } - - var isReleaseAnyApp: Bool { - if case .releaseAnyApp = self { return true } - return false - } } diff --git a/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redEnd.colorset/Contents.json b/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redEnd.colorset/Contents.json index d6c83955e2..ea96570efa 100644 --- a/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redEnd.colorset/Contents.json +++ b/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redEnd.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xBC", - "green" : "0xCA", - "red" : "0xF3" + "blue" : "0xF3", + "green" : "0xF6", + "red" : "0xFF" } }, "idiom" : "universal" diff --git a/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redStart.colorset/Contents.json b/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redStart.colorset/Contents.json index c1c222e8b9..c913932c36 100644 --- a/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redStart.colorset/Contents.json +++ b/Modules/Assets/Sources/Assets/Resources/SystemColors.xcassets/Custom/Gradients/HeaderAlert/redStart.colorset/Contents.json @@ -5,9 +5,9 @@ "color-space" : "srgb", "components" : { "alpha" : "1.000", - "blue" : "0xDE", - "green" : "0xE5", - "red" : "0xFC" + "blue" : "0xE0", + "green" : "0xE7", + "red" : "0xFE" } }, "idiom" : "universal" diff --git a/Modules/AsyncTools/Sources/AsyncTools/AsyncToManyStream.swift b/Modules/AsyncTools/Sources/AsyncTools/AsyncToManyStream.swift index 29d9bb8563..bc1d5c764d 100644 --- a/Modules/AsyncTools/Sources/AsyncTools/AsyncToManyStream.swift +++ b/Modules/AsyncTools/Sources/AsyncTools/AsyncToManyStream.swift @@ -12,6 +12,10 @@ public final class AsyncToManyStream: AsyncSequence, @unchecked Sendable wher public init() {} + public var value: T? { + return lastValue + } + public func makeAsyncIterator() -> AsyncIterator { subscribe().makeAsyncIterator() } @@ -70,6 +74,7 @@ public final class AsyncToManyStream: AsyncSequence, @unchecked Sendable wher continuation.finish() } continuations.removeAll() + lastValue = nil } private func removeContinuation(_ id: UUID) { @@ -77,4 +82,10 @@ public final class AsyncToManyStream: AsyncSequence, @unchecked Sendable wher defer { lock.unlock() } continuations.removeValue(forKey: id) } + + public func clearLastValue() { + lock.lock() + defer { lock.unlock() } + lastValue = nil + } } diff --git a/Modules/DeepLinks/Sources/DeepLinks/DeepLinkScheme.swift b/Modules/DeepLinks/Sources/DeepLinks/DeepLinkScheme.swift index bcfa49f0f7..fdaa2b7c4e 100644 --- a/Modules/DeepLinks/Sources/DeepLinks/DeepLinkScheme.swift +++ b/Modules/DeepLinks/Sources/DeepLinks/DeepLinkScheme.swift @@ -11,7 +11,6 @@ extension DeepLinkScheme { private enum Scheme { static let dev = "dev-anytype://" static let prodAnytype = "prod-anytype://" - static let prodAnyApp = "prod-anyapp://" static let main = "anytype://" } @@ -30,8 +29,6 @@ extension DeepLinkScheme { Scheme.dev case .releaseAnytype: Scheme.prodAnytype - case .releaseAnyApp: - Scheme.prodAnyApp } } } diff --git a/Modules/DesignKit/Sources/DesignKit/Components/BottomAlert/BottomAlertView.swift b/Modules/DesignKit/Sources/DesignKit/Components/BottomAlert/BottomAlertView.swift index 3370e633fe..a46fd25ea8 100644 --- a/Modules/DesignKit/Sources/DesignKit/Components/BottomAlert/BottomAlertView.swift +++ b/Modules/DesignKit/Sources/DesignKit/Components/BottomAlert/BottomAlertView.swift @@ -40,7 +40,7 @@ public struct BottomAlertView: View { .padding(.horizontal, 16) .padding(.top, 24) .padding(.bottom, 16) - .background(Color.Background.secondary) + .background(Material.ultraThick) } @ViewBuilder diff --git a/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonConfig.swift b/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonConfig.swift index 43714e2f47..9164d063a9 100644 --- a/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonConfig.swift +++ b/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonConfig.swift @@ -39,15 +39,46 @@ private extension CGSize { } } +private extension StandardButtonStyle { + + func primaryXSmallConfig(stretchSize: Bool, backgroundColor: Color? = nil) -> StandardButtonConfig { + let baseConfig = StandardButtonStyle.primaryLarge.config + + let normalStyle: StandardButtonConfig.Style + if let backgroundColor { + normalStyle = StandardButtonConfig.Style( + textColor: baseConfig.normal.textColor, + borderColor: baseConfig.normal.borderColor, + backgroundColor: backgroundColor, + overlayBackgroundColor: baseConfig.normal.overlayBackgroundColor + ) + } else { + normalStyle = baseConfig.normal + } + + return StandardButtonConfig( + normal: normalStyle, + higlighted: baseConfig.higlighted, + disabled: baseConfig.disabled, + textFont: .caption1Medium, + height: 28, + stretchSize: stretchSize, + radius: 14, + loadingIndicatorSize: .ButtonLoadingIndicator.xsmall, + horizontalPadding: 10 + ) + } +} + public extension StandardButtonStyle { - + var config: StandardButtonConfig { switch self { case .primaryLarge: return StandardButtonConfig( normal: StandardButtonConfig.Style( - textColor: .Text.inversion, - backgroundColor: .Control.primary + textColor: .Text.white, + backgroundColor: .Control.accent100 ), higlighted: StandardButtonConfig.Style( overlayBackgroundColor: Color(light: .white.opacity(0.15), dark: .black.opacity(0.15)) @@ -58,47 +89,47 @@ public extension StandardButtonStyle { ), textFont: .button1Medium, infoTextFont: .caption1Medium, - height: 48, + height: 52, stretchSize: true, - radius: 12, + radius: 26, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .secondaryLarge: return StandardButtonConfig( normal: StandardButtonConfig.Style( textColor: .Text.primary, - borderColor: .Shape.primary + borderColor: .Shape.transperentPrimary ), higlighted: StandardButtonConfig.Style( backgroundColor: .Shape.transperentSecondary ), disabled: StandardButtonConfig.Style( textColor: .Text.tertiary, - borderColor: .Shape.primary + borderColor: .Shape.transperentPrimary ), textFont: .button1Regular, - height: 48, + height: 52, stretchSize: true, - radius: 12, + radius: 26, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .warningLarge: return StandardButtonConfig( normal: StandardButtonConfig.Style( textColor: .Pure.red, - borderColor: .Shape.primary + borderColor: .Shape.transperentPrimary ), higlighted: StandardButtonConfig.Style( textColor: .Light.red ), disabled: StandardButtonConfig.Style( textColor: .Light.red, - borderColor: .Shape.secondary + borderColor: .Shape.transperentPrimary ), textFont: .button1Medium, - height: 48, + height: 52, stretchSize: true, - radius: 12, + radius: 26, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .borderlessLarge: @@ -127,7 +158,7 @@ public extension StandardButtonStyle { textFont: .button1Medium, height: 44, stretchSize: true, - radius: 10, + radius: 22, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .secondaryMedium: @@ -138,7 +169,7 @@ public extension StandardButtonStyle { textFont: .uxBodyRegular, height: 44, stretchSize: true, - radius: 10, + radius: 22, loadingIndicatorSize: .ButtonLoadingIndicator.large, horizontalPadding: 12 ) @@ -150,7 +181,7 @@ public extension StandardButtonStyle { textFont: .button1Medium, height: 44, stretchSize: true, - radius: 10, + radius: 22, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .primarySmall: @@ -161,7 +192,7 @@ public extension StandardButtonStyle { textFont: .uxCalloutMedium, height: 36, stretchSize: false, - radius: 8, + radius: 18, loadingIndicatorSize: .ButtonLoadingIndicator.small ) case .secondarySmall: @@ -172,7 +203,7 @@ public extension StandardButtonStyle { textFont: .uxCalloutRegular, height: 36, stretchSize: false, - radius: 8, + radius: 18, loadingIndicatorSize: .ButtonLoadingIndicator.small ) case .warningSmall: @@ -183,7 +214,7 @@ public extension StandardButtonStyle { textFont: .uxCalloutMedium, height: 36, stretchSize: false, - radius: 8, + radius: 18, loadingIndicatorSize: .ButtonLoadingIndicator.small ) case .borderlessSmall: @@ -206,38 +237,31 @@ public extension StandardButtonStyle { horizontalPadding: 0 ) case .primaryXSmall: - return StandardButtonConfig( - normal: StandardButtonStyle.primaryLarge.config.normal, - higlighted: StandardButtonStyle.primaryLarge.config.higlighted, - disabled: StandardButtonStyle.primaryLarge.config.disabled, - textFont: .caption1Medium, - height: 28, - stretchSize: false, - radius: 6, - loadingIndicatorSize: .ButtonLoadingIndicator.xsmall, - horizontalPadding: 10 - ) + return primaryXSmallConfig(stretchSize: false) case .primaryXSmallStretched: + return primaryXSmallConfig(stretchSize: true) + case .primaryXSmallStretchedBlack: + return primaryXSmallConfig(stretchSize: true, backgroundColor: .Control.primary) + case .secondaryXSmall: return StandardButtonConfig( - normal: StandardButtonStyle.primaryLarge.config.normal, - higlighted: StandardButtonStyle.primaryLarge.config.higlighted, - disabled: StandardButtonStyle.primaryLarge.config.disabled, - textFont: .caption1Medium, + normal: StandardButtonStyle.secondaryLarge.config.normal, + higlighted: StandardButtonStyle.secondaryLarge.config.higlighted, + disabled: StandardButtonStyle.secondaryLarge.config.disabled, + textFont: .caption1Regular, height: 28, - stretchSize: true, - radius: 6, - loadingIndicatorSize: .ButtonLoadingIndicator.xsmall, - horizontalPadding: 10 + stretchSize: false, + radius: 14, + loadingIndicatorSize: .ButtonLoadingIndicator.xsmall ) - case .secondaryXSmall: + case .secondaryXSmallStretched: return StandardButtonConfig( normal: StandardButtonStyle.secondaryLarge.config.normal, higlighted: StandardButtonStyle.secondaryLarge.config.higlighted, disabled: StandardButtonStyle.secondaryLarge.config.disabled, textFont: .caption1Regular, height: 28, - stretchSize: false, - radius: 6, + stretchSize: true, + radius: 14, loadingIndicatorSize: .ButtonLoadingIndicator.xsmall ) case .warningXSmall: @@ -248,7 +272,7 @@ public extension StandardButtonStyle { textFont: .caption1Medium, height: 28, stretchSize: false, - radius: 6, + radius: 14, loadingIndicatorSize: .ButtonLoadingIndicator.xsmall ) case .transparentXSmall: @@ -266,7 +290,7 @@ public extension StandardButtonStyle { textFont: .caption1Medium, height: 28, stretchSize: false, - radius: 6, + radius: 14, loadingIndicatorSize: .ButtonLoadingIndicator.xsmall ) case .upgradeBadge: @@ -285,48 +309,7 @@ public extension StandardButtonStyle { textFont: .calloutRegular, height: 32, stretchSize: true, - radius: 18, - loadingIndicatorSize: .ButtonLoadingIndicator.large - ) - case .primaryOvalLarge: - return StandardButtonConfig( - normal: StandardButtonConfig.Style( - textColor: .Text.white, - backgroundColor: .Control.accent100 - ), - higlighted: StandardButtonConfig.Style( - textColor: .Text.white, - backgroundColor: .Control.accent125 - ), - disabled: StandardButtonConfig.Style( - textColor: .Text.tertiary, - backgroundColor: .Control.tertiary - ), - textFont: .button1Medium, - infoTextFont: .caption1Medium, - height: 48, - stretchSize: true, - radius: 100, - loadingIndicatorSize: .ButtonLoadingIndicator.large - ) - case .secondaryOvalLarge: - return StandardButtonConfig( - normal: StandardButtonConfig.Style( - textColor: .Text.primary, - backgroundColor: .Shape.primary - ), - higlighted: StandardButtonConfig.Style( - textColor: .Text.primary, - backgroundColor: .Control.tertiary - ), - disabled: StandardButtonConfig.Style( - textColor: .Text.tertiary, - backgroundColor: .Shape.tertiary - ), - textFont: .button1Regular, - height: 48, - stretchSize: true, - radius: 100, + radius: 16, loadingIndicatorSize: .ButtonLoadingIndicator.large ) case .linkLarge: @@ -341,7 +324,7 @@ public extension StandardButtonStyle { textColor: .Text.tertiary ), textFont: .button1Regular, - height: 48, + height: 52, stretchSize: true, radius: 0, loadingIndicatorSize: .ButtonLoadingIndicator.large diff --git a/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonStyle.swift b/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonStyle.swift index d152c5b4d6..ea12199de5 100644 --- a/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonStyle.swift +++ b/Modules/DesignKit/Sources/DesignKit/Components/StandardButton/StandardButtonStyle.swift @@ -21,10 +21,10 @@ public enum StandardButtonStyle { case transparentXSmall case primaryXSmallStretched + case primaryXSmallStretchedBlack + case secondaryXSmallStretched case upgradeBadge - - case primaryOvalLarge - case secondaryOvalLarge + case linkLarge } diff --git a/Modules/DesignKit/Sources/DesignKit/Fonts/Helpers/Text+Style.swift b/Modules/DesignKit/Sources/DesignKit/Fonts/Helpers/Text+Style.swift index de5532c7d4..410454c0f6 100644 --- a/Modules/DesignKit/Sources/DesignKit/Fonts/Helpers/Text+Style.swift +++ b/Modules/DesignKit/Sources/DesignKit/Fonts/Helpers/Text+Style.swift @@ -28,7 +28,11 @@ public extension TextField { public extension View { func anytypeLineHeightStyle(_ style: AnytypeFont) -> some View { - self.environment(\._lineHeightMultiple, style.lineHeightMultiple) + if #available(iOS 26.0, *) { + return self.lineHeight(.exact(points: style.config.lineHeight)) + } else { + return self.environment(\._lineHeightMultiple, style.lineHeightMultiple) + } } } diff --git a/Modules/DesignKit/Sources/DesignKit/SystemExtensions/View+DragDrop.swift b/Modules/DesignKit/Sources/DesignKit/SystemExtensions/View+DragDrop.swift new file mode 100644 index 0000000000..247c63e2f2 --- /dev/null +++ b/Modules/DesignKit/Sources/DesignKit/SystemExtensions/View+DragDrop.swift @@ -0,0 +1,91 @@ +import SwiftUI +import UniformTypeIdentifiers + +public extension View { + + func onDragIf( + _ condition: Bool, + data: @escaping () -> NSItemProvider + ) -> some View { + modifier(ConditionalDragModifier(condition: condition, data: data)) + } + + func onDragIf( + _ condition: Bool, + data: @escaping () -> NSItemProvider, + @ViewBuilder preview: @escaping () -> V + ) -> some View where V: View { + modifier(ConditionalDragWithPreviewModifier(condition: condition, data: data, preview: preview)) + } + + func onDropIf( + _ condition: Bool, + of supportedContentTypes: [UTType], + delegate: any DropDelegate + ) -> some View { + modifier( + ConditionalDropModifier( + condition: condition, + supportedContentTypes: supportedContentTypes, + delegate: delegate + ) + ) + } +} + +private struct ConditionalDragModifier: ViewModifier { + let condition: Bool + let data: () -> NSItemProvider + + @Namespace private var namespace + + func body(content: Content) -> some View { + if condition { + content + .onDrag(data) + .matchedGeometryEffect(id: "content", in: namespace) + } else { + content + .matchedGeometryEffect(id: "content", in: namespace) + } + } +} + +private struct ConditionalDragWithPreviewModifier: ViewModifier { + + let condition: Bool + let data: () -> NSItemProvider + let preview: () -> Preview + + @Namespace private var namespace + + func body(content: Content) -> some View { + if condition { + content + .onDrag(data, preview: preview) + .matchedGeometryEffect(id: "content", in: namespace) + } else { + content + .matchedGeometryEffect(id: "content", in: namespace) + } + } +} + +private struct ConditionalDropModifier: ViewModifier { + let condition: Bool + let supportedContentTypes: [UTType] + let delegate: any DropDelegate + + @Namespace private var namespace + + func body(content: Content) -> some View { + if condition { + content + .onDrop(of: supportedContentTypes, delegate: delegate) + .matchedGeometryEffect(id: "content", in: namespace) + } else { + content + .matchedGeometryEffect(id: "content", in: namespace) + } + } +} diff --git a/Modules/Loc/Sources/Loc/Generated/Strings.swift b/Modules/Loc/Sources/Loc/Generated/Strings.swift index fe780e0150..3755c42eb9 100644 --- a/Modules/Loc/Sources/Loc/Generated/Strings.swift +++ b/Modules/Loc/Sources/Loc/Generated/Strings.swift @@ -373,6 +373,9 @@ public enum Loc { return Loc.tr("UI", "File", p1, fallback: "Plural format key: File") } public static let files = Loc.tr("UI", "Files", fallback: "Files") + public static func filesUploading(_ p1: Int) -> String { + return Loc.tr("UI", "Files uploading", p1, fallback: "%#@file@ uploading") + } public static let filter = Loc.tr("UI", "Filter", fallback: "Filter") public static let forever = Loc.tr("UI", "Forever", fallback: "Forever") public static let foreverFree = Loc.tr("UI", "Forever free", fallback: "Forever free") @@ -388,6 +391,7 @@ public enum Loc { public static let header = Loc.tr("UI", "Header", fallback: "Header") public static let hidden = Loc.tr("UI", "Hidden", fallback: "Hidden") public static let hide = Loc.tr("UI", "Hide", fallback: "Hide") + public static let hideDescription = Loc.tr("UI", "Hide Description", fallback: "Hide Description") public static let hideTypes = Loc.tr("UI", "Hide types", fallback: "Hide types") public static let highlight = Loc.tr("UI", "Highlight", fallback: "Highlight") public static let history = Loc.tr("UI", "History", fallback: "History") @@ -425,6 +429,7 @@ public enum Loc { public static let loadingPleaseWait = Loc.tr("UI", "Loading, please wait", fallback: "Loading, please wait") public static let localOnly = Loc.tr("UI", "Local Only", fallback: "Local Only") public static let lock = Loc.tr("UI", "Lock", fallback: "Lock") + public static let locked = Loc.tr("UI", "Locked", fallback: "Locked") public static let logOut = Loc.tr("UI", "Log out", fallback: "Log Out") public static let logoutAndClearData = Loc.tr("UI", "Logout and clear data", fallback: "Logout and clear data") public static let managePayment = Loc.tr("UI", "Manage payment", fallback: "Manage payment") @@ -444,7 +449,7 @@ public enum Loc { public static let moveTo = Loc.tr("UI", "Move to", fallback: "Move to") public static let moveToBin = Loc.tr("UI", "Move To Bin", fallback: "Move To Bin") public static let mute = Loc.tr("UI", "Mute", fallback: "Mute") - public static let myChannels = Loc.tr("UI", "My channels", fallback: "My Channels") + public static let myChannels = Loc.tr("UI", "My channels", fallback: "Channels") public static let myFirstSpace = Loc.tr("UI", "My First Space", fallback: "My First Space") public static let myProperties = Loc.tr("UI", "My Properties", fallback: "My Properties") public static let mySites = Loc.tr("UI", "My Sites", fallback: "My Sites") @@ -597,6 +602,7 @@ public enum Loc { public static let settings = Loc.tr("UI", "Settings", fallback: "Settings") public static let share = Loc.tr("UI", "Share", fallback: "Share") public static let show = Loc.tr("UI", "Show", fallback: "Show") + public static let showDescription = Loc.tr("UI", "Show Description", fallback: "Show Description") public static let showTypes = Loc.tr("UI", "Show types", fallback: "Show types") public static let skip = Loc.tr("UI", "Skip", fallback: "Skip") public static let sky = Loc.tr("UI", "Sky", fallback: "Sky") @@ -611,6 +617,7 @@ public enum Loc { return Loc.tr("UI", "SuccessfullyDeleted ", String(describing: p1), fallback: "%@ deleted successfully") } public static let synced = Loc.tr("UI", "Synced", fallback: "Synced") + public static let syncing = Loc.tr("UI", "Syncing...", fallback: "Syncing...") public static let systemProperties = Loc.tr("UI", "System Properties", fallback: "System Properties") public static func tag(_ p1: Int) -> String { return Loc.tr("UI", "Tag", p1, fallback: "Plural format key: Tag") @@ -648,8 +655,10 @@ public enum Loc { public static let unknownError = Loc.tr("UI", "Unknown error", fallback: "Unknown error") public static let unlimited = Loc.tr("UI", "unlimited", fallback: "Unlimited") public static let unlock = Loc.tr("UI", "Unlock", fallback: "Unlock") + public static let unlocked = Loc.tr("UI", "Unlocked", fallback: "Unlocked") public static let unmute = Loc.tr("UI", "Unmute", fallback: "Unmute") public static let unpin = Loc.tr("UI", "Unpin", fallback: "Unpin") + public static let unpinned = Loc.tr("UI", "Unpinned", fallback: "Unpinned") public static let unpublish = Loc.tr("UI", "Unpublish", fallback: "Unpublish") public static let unread = Loc.tr("UI", "Unread", fallback: "Unread") public static let unselectAll = Loc.tr("UI", "Unselect all", fallback: "Unselect all") @@ -956,9 +965,7 @@ public enum Loc { } public enum Space { public static let getMore = Loc.tr("UI", "FileStorage.Space.GetMore", fallback: "Get more space") - public static func instruction(_ p1: Any) -> String { - return Loc.tr("UI", "FileStorage.Space.Instruction", String(describing: p1), fallback: "You can store up to %@ of your files on our encrypted backup node for free. If you reach the limit, files will be stored only locally.") - } + public static let instruction = Loc.tr("UI", "FileStorage.Space.Instruction", fallback: "You can store your files on our encrypted backup node. Once you reach your limit, files will stop syncing and will only be stored locally.") public static let localOnlyInstruction = Loc.tr("UI", "FileStorage.Space.LocalOnlyInstruction", fallback: "Remote storage is not available in local-only mode. Your files are stored locally on your device.") public static let title = Loc.tr("UI", "FileStorage.Space.Title", fallback: "Remote storage") public static func used(_ p1: Any, _ p2: Any) -> String { @@ -2427,7 +2434,7 @@ public enum Loc { } } public enum Spaces { - public static let title = Loc.tr("Workspace", "Spaces.Title", fallback: "Spaces") + public static let title = Loc.tr("Workspace", "Spaces.Title", fallback: "Channels") public enum Accessibility { public static let personal = Loc.tr("Workspace", "Spaces.Accessibility.Personal", fallback: "Entry Space") public static let `private` = Loc.tr("Workspace", "Spaces.Accessibility.Private", fallback: "Private Space") diff --git a/Modules/Loc/Sources/Loc/Resources/Auth.xcstrings b/Modules/Loc/Sources/Loc/Resources/Auth.xcstrings index 8da1328b4f..79f4a88a69 100644 --- a/Modules/Loc/Sources/Loc/Resources/Auth.xcstrings +++ b/Modules/Loc/Sources/Loc/Resources/Auth.xcstrings @@ -861,7 +861,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "We’d love to share tips, tricks and product updates with you. Your email is never linked to your identity. We won’t share your data. Ever." + "value" : "ĐœŅ‹ ĐąŅ‹ Ņ…ĐžŅ‚ĐĩĐģи Đ´ĐĩĐģĐ¸Ņ‚ŅŒŅŅ ҁ ваĐŧи ĐŋĐžĐ´ŅĐēаСĐēаĐŧи, Ņ…Đ¸Ņ‚Ņ€ĐžŅŅ‚ŅĐŧи и ОйĐŊОвĐģĐĩĐŊĐ¸ŅĐŧи. Đ’Đ°Ņˆ Đ°Đ´Ņ€Đĩҁ ŅĐģĐĩĐēŅ‚Ņ€ĐžĐŊĐŊОК ĐŋĐžŅ‡Ņ‚Ņ‹ ĐŊиĐēĐžĐŗĐ´Đ° ĐŊĐĩ ĐąŅƒĐ´ĐĩŅ‚ ĐŋŅ€Đ¸Đ˛ŅĐˇĐ°ĐŊ Đē Đ˛Đ°ŅˆĐĩĐš ĐģĐ¸Ņ‡ĐŊĐžŅŅ‚Đ¸. ĐœŅ‹ ĐŊĐĩ ĐąŅƒĐ´ĐĩĐŧ Đ´ĐĩĐģĐ¸Ņ‚ŅŒŅŅ Đ˛Đ°ŅˆĐ¸Đŧи даĐŊĐŊŅ‹Đŧи. НиĐēĐžĐŗĐ´Đ°." } }, "tr" : { @@ -1308,7 +1308,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Stay in the loop" + "value" : "ĐžŅŅ‚Đ°Đ˛Đ°ĐšŅ‚ĐĩҁҌ в ĐēŅƒŅ€ŅĐĩ" } }, "tr" : { @@ -1540,7 +1540,7 @@ "fr" : { "stringUnit" : { "state" : "new", - "value" : "Read more" + "value" : "En savoir plus" } }, "id" : { @@ -1606,7 +1606,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Read more" + "value" : "ĐŸĐžĐ´Ņ€ĐžĐąĐŊĐĩĐĩ" } }, "tr" : { @@ -2053,7 +2053,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Reveal and copy" + "value" : "ПоĐēĐ°ĐˇĐ°Ņ‚ŅŒ и ҁĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" } }, "tr" : { @@ -2136,7 +2136,7 @@ "fr" : { "stringUnit" : { "state" : "new", - "value" : "It replaces login and password. Keep it safe — you control your data. You can find this Key later in app settings." + "value" : "Votre clÊ remplace identifiant et mot de passe. Gardez-la en sÊcuritÊ — vous contrôlez vos donnÊes. Vous pourrez la retrouver plus tard dans les paramètres de l'application." } }, "id" : { @@ -2202,7 +2202,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "It replaces login and password. Keep it safe — you control your data. You can find this Key later in app settings." + "value" : "ОĐŊ СаĐŧĐĩĐŊŅĐĩŅ‚ ĐģĐžĐŗĐ¸ĐŊ и ĐŋĐ°Ņ€ĐžĐģҌ. ДĐĩŅ€ĐļĐ¸Ņ‚Đĩ ĐĩĐŗĐž в ĐąĐĩСОĐŋĐ°ŅĐŊĐžŅŅ‚Đ¸ — Đ˛Ņ‹ ĐēĐžĐŊŅ‚Ņ€ĐžĐģĐ¸Ņ€ŅƒĐĩŅ‚Đĩ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ. Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐŊĐ°ĐšŅ‚Đ¸ ŅŅ‚ĐžŅ‚ ĐēĐģŅŽŅ‡ ĐŋОСĐļĐĩ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ." } }, "tr" : { @@ -3544,7 +3544,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Select one role or background that best fits you" + "value" : "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ОдĐŊ҃ Ņ€ĐžĐģҌ иĐģи Ņ„ĐžĐŊ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ ĐģŅƒŅ‡ŅˆĐĩ Đ˛ŅĐĩĐŗĐž ĐŋĐžĐ´Ņ…ĐžĐ´ŅŅ‚ ваĐŧ" } }, "tr" : { @@ -4438,7 +4438,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Founder / Entrepreneur" + "value" : "ĐžŅĐŊĐžĐ˛Đ°Ņ‚ĐĩĐģҌ / ĐŸŅ€ĐĩĐ´ĐŋŅ€Đ¸ĐŊиĐŧĐ°Ņ‚ĐĩĐģҌ" } }, "tr" : { @@ -4736,7 +4736,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Marketer" + "value" : "ĐœĐ°Ņ€ĐēĐĩŅ‚ĐžĐģĐžĐŗ" } }, "tr" : { @@ -4885,7 +4885,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Researcher / Academic" + "value" : "Đ˜ŅŅĐģĐĩĐ´ĐžĐ˛Đ°Ņ‚ĐĩĐģҌ / АĐēадĐĩĐŧиĐē" } }, "tr" : { @@ -5034,7 +5034,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Student" + "value" : "ĐĄŅ‚ŅƒĐ´ĐĩĐŊŅ‚" } }, "tr" : { @@ -5183,7 +5183,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Writer / Journalist" + "value" : "ĐŸĐ¸ŅĐ°Ņ‚ĐĩĐģҌ / Đ–ŅƒŅ€ĐŊаĐģĐ¸ŅŅ‚" } }, "tr" : { @@ -5332,7 +5332,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Habit tracking" + "value" : "ĐžŅ‚ŅĐģĐĩĐļиваĐŊиĐĩ ĐŋŅ€Đ¸Đ˛Ņ‹Ņ‡ĐĩĐē" } }, "tr" : { @@ -5481,7 +5481,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Personal knowledge base / PKM" + "value" : "База ĐģĐ¸Ņ‡ĐŊҋ҅ СĐŊаĐŊиК / БЛЗ" } }, "tr" : { @@ -5630,7 +5630,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Life planning" + "value" : "ПĐģаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐļиСĐŊи" } }, "tr" : { @@ -5713,7 +5713,7 @@ "fr" : { "stringUnit" : { "state" : "new", - "value" : "Messaging & group chats" + "value" : "Messagerie et conversations de groupe" } }, "id" : { @@ -5779,7 +5779,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Messaging & group chats" + "value" : "ĐžĐąŅ‰ĐĩĐŊиĐĩ и ĐŗŅ€ŅƒĐŋĐŋĐžĐ˛Ņ‹Đĩ Ņ‡Đ°Ņ‚Ņ‹" } }, "tr" : { @@ -5928,7 +5928,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Personal note-taking" + "value" : "Đ›Đ¸Ņ‡ĐŊŅ‹Đĩ СаĐŧĐĩŅ‚Đēи" } }, "tr" : { @@ -6011,7 +6011,7 @@ "fr" : { "stringUnit" : { "state" : "new", - "value" : "Projects & tasks management" + "value" : "Gestion des projets et des tÃĸches" } }, "id" : { @@ -6077,7 +6077,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Projects & tasks management" + "value" : "ĐŖĐŋŅ€Đ°Đ˛ĐģĐĩĐŊиĐĩ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Đŧи и ĐˇĐ°Đ´Đ°Ņ‡Đ°Đŧи" } }, "tr" : { @@ -6160,7 +6160,7 @@ "fr" : { "stringUnit" : { "state" : "new", - "value" : "Team work & shared docs" + "value" : "Travail d'Êquipe et documentation partagÊe" } }, "id" : { @@ -6226,7 +6226,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Team work & shared docs" + "value" : "Đ Đ°ĐąĐžŅ‚Đ° в ĐēĐžĐŧаĐŊĐ´Đĩ и ĐžĐąŅ‰Đ¸Đĩ Đ´ĐžĐē҃ĐŧĐĩĐŊ҂ҋ" } }, "tr" : { @@ -6822,7 +6822,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Pick one use case that fits you best" + "value" : "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ОдиĐŊ Đ˛Đ°Ņ€Đ¸Đ°ĐŊŅ‚ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°ĐŊĐ¸Ņ, ĐēĐžŅ‚ĐžŅ€Ņ‹Đš ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ ваĐŧ ĐģŅƒŅ‡ŅˆĐĩ Đ˛ŅĐĩĐŗĐž" } }, "tr" : { @@ -6971,7 +6971,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "What do you want to use Anytype for?" + "value" : "ДĐģŅ ҇ĐĩĐŗĐž Đ˛Ņ‹ Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ Đ¸ŅĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ŅŒ Anytype?" } }, "tr" : { @@ -7269,7 +7269,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "or enter with" + "value" : "иĐģи ввĐĩĐ´Đ¸Ņ‚Đĩ ҇ĐĩŅ€ĐĩС" } }, "tr" : { @@ -8313,7 +8313,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Encrypted, local," + "value" : "Đ—Đ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš, ĐģĐžĐēаĐģҌĐŊŅ‹Đš," } }, "tr" : { @@ -8462,7 +8462,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "yours forever" + "value" : "Đ˛Đ°Ņˆ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°" } }, "tr" : { @@ -10401,7 +10401,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "witch collapse practice feed shame open despair creek road again ice least lake tree young address brain despair" + "value" : "ВĐĩĐ´ŅŒĐŧа ĐēŅ€Đ°Ņ… ĐŋŅ€Đ°ĐēŅ‚Đ¸Đēа ĐēĐžŅ€ĐŧĐ¸Ņ‚ŅŒ ŅŅ‚Ņ‹Đ´ ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°Ņ‚ŅŒ ĐžŅ‚Ņ‡Đ°ŅĐŊиĐĩ Ņ€ŅƒŅ‡ĐĩĐš Đ´ĐžŅ€ĐžĐŗĐ° ҁĐŊОва ĐģŅ‘Đ´ ĐŊаиĐŧĐĩĐŊŅŒŅˆĐ¸Đš ОСĐĩŅ€Đž Đ´ĐĩŅ€ĐĩвО ĐŧĐžĐģОдОК Đ°Đ´Ņ€Đĩҁ ĐŧĐžĐˇĐŗ ĐžŅ‚Ņ‡Đ°ŅĐŊиĐĩ" } }, "tr" : { @@ -10848,7 +10848,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Please clear approximately %@ of space and run the process again." + "value" : "ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐžŅĐ˛ĐžĐąĐžĐ´Đ¸Ņ‚Đĩ %@ ĐŧĐĩŅŅ‚Đ° и СаĐŋŅƒŅŅ‚Đ¸Ņ‚Đĩ ĐŋŅ€ĐžŅ†Đĩҁҁ ҁĐŊОва." } }, "tr" : { @@ -11892,7 +11892,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Update is in progress..." + "value" : "Đ˜Đ´Ņ‘Ņ‚ ОйĐŊОвĐģĐĩĐŊиĐĩ..." } }, "tr" : { diff --git a/Modules/Loc/Sources/Loc/Resources/UI.xcstrings b/Modules/Loc/Sources/Loc/Resources/UI.xcstrings index eb43ccf4d1..86408ccdf6 100644 --- a/Modules/Loc/Sources/Loc/Resources/UI.xcstrings +++ b/Modules/Loc/Sources/Loc/Resources/UI.xcstrings @@ -968,7 +968,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ëŦ¸ė˜í•˜ę¸°" + "value" : "ëŦ¸ė˜" } }, "nb" : { @@ -4288,7 +4288,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Add a description..." + "value" : "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ..." } }, "tr" : { @@ -6972,7 +6972,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unlinked objects that do not have a direct link or backlink with other objects in the graph." + "value" : "НĐĩĐŋŅ€Đ¸Đ˛ŅĐˇĐ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ, ĐŊĐĩ иĐŧĐĩŅŽŅ‰Đ¸Đĩ ĐŋŅ€ŅĐŧОК ŅĐ˛ŅĐˇĐ¸ иĐģи ĐžĐąŅ€Đ°Ņ‚ĐŊОК ŅĐ˛ŅĐˇĐ¸ ҁ Đ´Ņ€ŅƒĐŗĐ¸Đŧи ĐžĐąŅŠĐĩĐēŅ‚Đ°Đŧи ĐŊа ĐŗŅ€Đ°Ņ„Đĩ." } }, "tr" : { @@ -7121,7 +7121,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Only unlinked" + "value" : "ĐĸĐžĐģҌĐēĐž ĐŊĐĩŅĐ˛ŅĐˇĐ°ĐŊĐŊŅ‹Đĩ" } }, "tr" : { @@ -7717,7 +7717,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Date created" + "value" : "Đ”Đ°Ņ‚Đ° ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ" } }, "tr" : { @@ -9058,7 +9058,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Application" + "value" : "ĐŸŅ€Đ¸ĐģĐžĐļĐĩĐŊиĐĩ" } }, "tr" : { @@ -10343,7 +10343,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Attach Object" + "value" : "ĐŸŅ€Đ¸ĐēŅ€ĐĩĐŋĐ¸Ņ‚ŅŒ ĐžĐąŅŠĐĩĐēŅ‚" } }, "tr" : { @@ -10741,25 +10741,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Attachments" + "value" : "%lld ВĐģĐžĐļĐĩĐŊиК" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Attachments" + "value" : "%lld вĐģĐžĐļĐĩĐŊиК" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Attachment" + "value" : "ВĐģĐžĐļĐĩĐŊиĐĩ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Attachments" + "value" : "%lld вĐģĐžĐļĐĩĐŊиК" } } } @@ -11214,13 +11214,13 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Audios" + "value" : "%lld ĐŅƒĐ´Đ¸Đž" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Audios" + "value" : "%lld ĐŅƒĐ´Đ¸Đž" } }, "one" : { @@ -11232,7 +11232,7 @@ "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Audios" + "value" : "%lld ĐŅƒĐ´Đ¸Đž" } } } @@ -15738,25 +15738,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Bookmarks" + "value" : "%lld ЗаĐēĐģадОĐē" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Bookmarks" + "value" : "%lld ЗаĐēĐģадОĐē" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Bookmark" + "value" : "ЗаĐēĐģадĐēа" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Bookmarks" + "value" : "%lld ЗаĐēĐģадĐēи" } } } @@ -17601,7 +17601,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Channel Type" + "value" : "ĐĸиĐŋ ĐēаĐŊаĐģа" } }, "tr" : { @@ -20434,7 +20434,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Content Model" + "value" : "МодĐĩĐģҌ ŅĐžĐ´ĐĩŅ€ĐļиĐŧĐžĐŗĐž" } }, "tr" : { @@ -20732,7 +20732,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Yes, convert" + "value" : "Да, ĐēĐžĐŊвĐĩŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ" } }, "tr" : { @@ -20881,7 +20881,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Switching between Space and Chat will significantly change the experience." + "value" : "ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡ĐĩĐŊиĐĩ ĐŧĐĩĐļĐ´Ņƒ ĐŸŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛ĐžĐŧ и Đ§Đ°Ņ‚ĐžĐŧ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ĐĩĐŊĐŊĐž иСĐŧĐĩĐŊĐ¸Ņ‚ Đ˛Đ°Ņˆ ĐžĐŋҋ҂ Ņ€Đ°ĐąĐžŅ‚Ņ‹." } }, "tr" : { @@ -21030,7 +21030,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Convert Channel Type?" + "value" : "КоĐŊвĐĩŅ€Ņ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚Đ¸Đŋ ĐēаĐŊаĐģа?" } }, "tr" : { @@ -23266,7 +23266,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Create property ‘%@’" + "value" : "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đž ‘%@’" } }, "tr" : { @@ -23564,7 +23564,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Create Space" + "value" : "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž" } }, "tr" : { @@ -24011,7 +24011,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Customize URL" + "value" : "ĐĐ°ŅŅ‚Ņ€ĐžĐ¸Ņ‚ŅŒ URL" } }, "tr" : { @@ -25304,25 +25304,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Dates" + "value" : "%lld Đ”Đ°Ņ‚" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Dates" + "value" : "%lld Đ”Đ°Ņ‚" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Date" + "value" : "Đ”Đ°Ņ‚Đ°" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Dates" + "value" : "%lld Đ”Đ°Ņ‚Ņ‹" } } } @@ -26520,7 +26520,7 @@ "zero" : { "stringUnit" : { "state" : "new", - "value" : "today" + "value" : "ҁĐĩĐŗĐžĐ´ĐŊŅ" } } } @@ -27996,7 +27996,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Delete Object Type" + "value" : "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ‚Đ¸Đŋ ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "tr" : { @@ -29878,7 +29878,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Disabled" + "value" : "ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊĐž" } }, "tr" : { @@ -30027,7 +30027,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Document scan failed" + "value" : "ХйОК ҁĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐ¸Ņ Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°" } }, "tr" : { @@ -31070,7 +31070,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Edit property" + "value" : "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đž" } }, "tr" : { @@ -31368,7 +31368,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Edit type" + "value" : "Đ ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Ņ‚Đ¸Đŋ" } }, "tr" : { @@ -31964,7 +31964,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "%@ embed. This content is not available on mobile" + "value" : "%@ Đ˛ŅŅ‚Ņ€Đ°Đ¸Đ˛Đ°ĐĩĐŧŅ‹Đš ĐēĐžĐŊŅ‚ĐĩĐŊŅ‚ ĐŊĐĩ Đ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ ĐŊа ĐŧОйиĐģҌĐŊĐžĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ" } }, "tr" : { @@ -32113,7 +32113,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "%@ embed. Opens in external app or browser" + "value" : "%@ Đ˛ŅŅ‚Ņ€Đ°Đ¸Đ˛Đ°ĐĩŅ‚ŅŅ. ĐžŅ‚ĐēŅ€Ņ‹Đ˛Đ°ĐĩŅ‚ŅŅ вО вĐŊĐĩ҈ĐŊĐĩĐŧ ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии иĐģи ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ" } }, "tr" : { @@ -32262,7 +32262,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "%@ embed is empty" + "value" : "Đ’ŅŅ‚Đ°Đ˛Đēа %@ ĐŋŅƒŅŅ‚Đ°" } }, "tr" : { @@ -33306,7 +33306,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Publish your first web site to get started." + "value" : "ОĐŋŅƒĐąĐģиĐēŅƒĐšŅ‚Đĩ ŅĐ˛ĐžĐš ĐŋĐĩŅ€Đ˛Ņ‹Đš вĐĩĐą-ŅĐ°ĐšŅ‚, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŊĐ°Ņ‡Đ°Ņ‚ŅŒ." } }, "tr" : { @@ -33455,7 +33455,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Enabled" + "value" : "ВĐēĐģŅŽŅ‡ĐĩĐŊĐž" } }, "tr" : { @@ -36735,7 +36735,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Experimental Features" + "value" : "Đ­ĐēҁĐŋĐĩŅ€Đ¸ĐŧĐĩĐŊŅ‚Đ°ĐģҌĐŊŅ‹Đĩ Ņ„ŅƒĐŊĐēŅ†Đ¸Đ¸" } }, "tr" : { @@ -36884,7 +36884,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Always pick object type when creating" + "value" : "Đ’ŅĐĩĐŗĐ´Đ° Đ˛Ņ‹ĐąĐ¸Ņ€Đ°Ņ‚ŅŒ Ņ‚Đ¸Đŋ ĐžĐąŅŠĐĩĐēŅ‚Đ° ĐŋŅ€Đ¸ ŅĐžĐˇĐ´Đ°ĐŊии" } }, "tr" : { @@ -37033,7 +37033,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "New Object Creation Menu" + "value" : "МĐĩĐŊŅŽ ŅĐžĐˇĐ´Đ°ĐŊĐ¸Ņ ĐŊĐžĐ˛ĐžĐŗĐž ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "tr" : { @@ -37480,7 +37480,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Featured properties" + "value" : "҃ĐļĐĩ ĐŋŅ€ĐžĐ´Đ°ĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐē҂ҋ" } }, "tr" : { @@ -38027,25 +38027,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Files" + "value" : "%lld Ņ„Đ°ĐšĐģОв" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Files" + "value" : "%lld Ņ„Đ°ĐšĐģОв" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "File" + "value" : "ФаКĐģ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Files" + "value" : "%lld Ņ„Đ°ĐšĐģОв" } } } @@ -38286,6 +38286,695 @@ } } }, + "Files uploading" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "few" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "many" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "two" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "zero" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "few" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "many" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "translated", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "translated", + "value" : "%arg files" + } + } + } + } + } + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Cargando %#@file@" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg archivo" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg archivos" + } + } + } + } + } + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "few" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "many" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "few" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "many" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ yÃŧkleniyor" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg dosya" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg dosya" + } + } + } + } + } + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "few" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "many" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + }, + "one" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg file" + } + }, + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "%#@file@ uploading" + }, + "substitutions" : { + "file" : { + "formatSpecifier" : "ld", + "variations" : { + "plural" : { + "other" : { + "stringUnit" : { + "state" : "new", + "value" : "%arg files" + } + } + } + } + } + } + } + } + }, "FilesList.ForceDelete.Title" : { "extractionState" : "manual", "localizations" : { @@ -40099,13 +40788,13 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "You can store up to %@ of your files on our encrypted backup node for free. If you reach the limit, files will be stored only locally." + "value" : "You can store your files on our encrypted backup node. Once you reach your limit, files will stop syncing and will only be stored locally." } }, "es" : { "stringUnit" : { "state" : "new", - "value" : "Puedes almacenar gratuitamente hasta %@ de archivos en nuestro nodo de respaldo cifrado. Si llegas al límite, los archivos se almacenarÃĄn solo localmente." + "value" : "Puedes almacenar gratuitamente hasta %@ de archivos en nuestro nodo de respaldo cifrado. Cuando llegues al límite, los archivos dejarÃĄn de sincronizarse y solo se almacenarÃĄn localmente." } }, "fa" : { @@ -40135,7 +40824,7 @@ "it" : { "stringUnit" : { "state" : "new", - "value" : "Puoi archiviare fino a %@ dei tuoi file sul nostro nodo di backup crittografato gratuitamente. Se raggiungi il limite, i file verranno archiviati solo in locale." + "value" : "Puoi archiviare i tuoi file sul nostro nodo di backup crittografato. Una volta raggiunto il limite, i file smetteranno di sincronizzarsi e saranno archiviati solo localmente." } }, "ja" : { @@ -40153,7 +40842,7 @@ "nb" : { "stringUnit" : { "state" : "new", - "value" : "You can store up to %@ of your files on our encrypted backup node for free. If you reach the limit, files will be stored only locally." + "value" : "You can store your files on our encrypted backup node. Once you reach your limit, files will stop syncing and will only be stored locally." } }, "nl" : { @@ -40338,7 +41027,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Remote storage is not available in local-only mode. Your files are stored locally on your device." + "value" : "ĐŖĐ´Đ°ĐģĐĩĐŊĐŊĐžĐĩ Ņ…Ņ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐŊĐž в ĐģĐžĐēаĐģҌĐŊĐžĐŧ Ņ€ĐĩĐļиĐŧĐĩ. Đ’Đ°ŅˆĐ¸ Ņ„Đ°ĐšĐģŅ‹ Ņ…Ņ€Đ°ĐŊŅŅ‚ŅŅ ĐģĐžĐēаĐģҌĐŊĐž ĐŊа Đ˛Đ°ŅˆĐĩĐŧ ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đĩ." } }, "tr" : { @@ -43320,7 +44009,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "I got it!" + "value" : "Đ¯ ĐŋĐžĐŊŅĐģ!" } }, "tr" : { @@ -44547,6 +45236,155 @@ } } }, + "Hide Description" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Hide Description" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Ocultad descripciÃŗn" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Sembunyikan Deskripsi" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Nascondi Descrizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "네ëĒ… 눍揰揰" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "ĐĄĐēŅ€Ņ‹Ņ‚ŅŒ ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "AÃ§ÄąklamayÄą Gizle" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Hide Description" + } + } + } + }, "Hide types" : { "extractionState" : "manual", "localizations" : { @@ -45806,25 +46644,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Images" + "value" : "%lld Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиК" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Images" + "value" : "%lld Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиК" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Image" + "value" : "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Images" + "value" : "%lld Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊĐ¸Ņ" } } } @@ -46030,7 +46868,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Image from Photo Library" + "value" : "Đ˜ĐˇĐžĐąŅ€Đ°ĐļĐĩĐŊиĐĩ иС Đ¤ĐžŅ‚ĐžĐŗĐ°ĐģĐĩŅ€Đĩи" } }, "tr" : { @@ -48210,7 +49048,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Keychain" + "value" : "ĐĄĐ˛ŅĐˇĐēа ĐēĐģŅŽŅ‡ĐĩĐš" } }, "tr" : { @@ -48955,7 +49793,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Let's try it" + "value" : "Đ”Đ°Đ˛Đ°ĐšŅ‚Đĩ ĐŋĐžĐŋŅ€ĐžĐąŅƒĐĩĐŧ!" } }, "tr" : { @@ -51317,25 +52155,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Lists" + "value" : "%lld ĐĄĐŋĐ¸ŅĐēОв" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Lists" + "value" : "%lld ĐĄĐŋĐ¸ŅĐēОв" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "List" + "value" : "ĐĄĐŋĐ¸ŅĐžĐē" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Lists" + "value" : "%lld ĐĄĐŋĐ¸ŅĐēи" } } } @@ -52023,6 +52861,155 @@ } } }, + "Locked" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Locked" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Protegido" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Terkunci" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Bloccato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "ėž ęš€" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "ЗабĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "Kilitlendi" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Locked" + } + } + } + }, "Log out" : { "extractionState" : "manual", "localizations" : { @@ -54997,7 +55984,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Mute" + "value" : "Đ—Đ°ĐŗĐģŅƒŅˆĐ¸Ņ‚ŅŒ" } }, "tr" : { @@ -55056,7 +56043,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "My Channels" + "value" : "Channels" } }, "es" : { @@ -55092,7 +56079,7 @@ "it" : { "stringUnit" : { "state" : "new", - "value" : "I miei Spazi" + "value" : "I miei Canali" } }, "ja" : { @@ -55110,7 +56097,7 @@ "nb" : { "stringUnit" : { "state" : "new", - "value" : "My Channels" + "value" : "Channels" } }, "nl" : { @@ -55593,7 +56580,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "My Sites" + "value" : "Мои ŅĐ°ĐšŅ‚Ņ‹" } }, "tr" : { @@ -57381,7 +58368,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "No matches found.\nTry a different keyword or check your spelling." + "value" : "ХОвĐŋадĐĩĐŊĐ¸Ņ ĐŊĐĩ ĐŊаКдĐĩĐŊŅ‹.\nПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đ´Ņ€ŅƒĐŗĐžĐĩ ĐēĐģŅŽŅ‡ĐĩвОĐĩ ҁĐģОвО иĐģи ĐŋŅ€ĐžĐ˛ĐĩŅ€ŅŒŅ‚Đĩ ĐŋŅ€Đ°Đ˛Đ¸ĐģҌĐŊĐžŅŅ‚ŅŒ ĐŊаĐŋĐ¸ŅĐ°ĐŊĐ¸Ņ." } }, "tr" : { @@ -57530,7 +58517,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "No properties yet. Add some to this type." + "value" : "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛ ĐŋĐžĐēа ĐŊĐĩŅ‚. Đ”ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đē ŅŅ‚ĐžĐŧ҃ Ņ‚Đ¸Đŋ҃." } }, "tr" : { @@ -58382,7 +59369,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ë‹¤ė‹œ ė‹¤í–‰í•  ėž‘ė—…ė´ ė—†ėŠĩ니다." + "value" : "ë‹¤ė‹œ ė‹¤í–‰í•  ėž‘ė—… ė—†ėŒ" } }, "nb" : { @@ -58531,7 +59518,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ė‹¤í–‰ ėˇ¨ė†Œí•  ėž‘ė—…ė´ ė—†ėŠĩ니다" + "value" : "ė‹¤í–‰ ėˇ¨ė†Œí•  ėž‘ė—…ė´ ė—†ėŒ" } }, "nb" : { @@ -58971,25 +59958,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Objects" + "value" : "%lld ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Objects" + "value" : "%lld ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Object" + "value" : "ĐžĐąŅŠĐĩĐēŅ‚" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Objects" + "value" : "%lld ĐžĐąŅŠĐĩĐē҂ҋ" } } } @@ -60133,25 +61120,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Object types" + "value" : "%lld ĐĸиĐŋОв ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Object types" + "value" : "%lld ĐĸиĐŋОв ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Object type" + "value" : "ĐĸиĐŋ ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Object types" + "value" : "%lld ĐĸиĐŋŅ‹ ĐžĐąŅŠĐĩĐēŅ‚Đ°" } } } @@ -60655,7 +61642,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Are you sure you want to delete this Type? All existing objects of this type will be preserved, but will no longer be associated with it." + "value" : "Đ’Ņ‹ ŅƒĐ˛ĐĩŅ€ĐĩĐŊŅ‹, Ņ‡Ņ‚Đž Ņ…ĐžŅ‚Đ¸Ņ‚Đĩ ŅƒĐ´Đ°ĐģĐ¸Ņ‚ŅŒ ŅŅ‚ĐžŅ‚ Ņ‚Đ¸Đŋ? Đ’ŅĐĩ ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ¸Đĩ ĐžĐąŅŠĐĩĐē҂ҋ ŅŅ‚ĐžĐŗĐž Ņ‚Đ¸Đŋа ĐąŅƒĐ´ŅƒŅ‚ ŅĐžŅ…Ņ€Đ°ĐŊĐĩĐŊŅ‹, ĐŊĐž йОĐģҌ҈Đĩ ĐŊĐĩ ĐąŅƒĐ´ŅƒŅ‚ ŅĐ˛ŅĐˇĐ°ĐŊŅ‹ ҁ ĐŊиĐŧ." } }, "tr" : { @@ -60804,7 +61791,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Delete Object Type?" + "value" : "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ Ņ‚Đ¸Đŋ ĐžĐąŅŠĐĩĐēŅ‚Đ°?" } }, "tr" : { @@ -61251,7 +62238,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "On analytics" + "value" : "По аĐŊаĐģĐ¸Ņ‚Đ¸ĐēĐĩ" } }, "tr" : { @@ -62443,7 +63430,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Open web page" + "value" : "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņƒ" } }, "tr" : { @@ -62592,7 +63579,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Open Settings" + "value" : "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи" } }, "tr" : { @@ -62890,7 +63877,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Other properties" + "value" : "Đ”Ņ€ŅƒĐŗĐ¸Đĩ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đ°" } }, "tr" : { @@ -64182,13 +65169,13 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld PDFs" + "value" : "%lld PDF" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld PDFs" + "value" : "%lld PDF" } }, "one" : { @@ -64200,7 +65187,7 @@ "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld PDFs" + "value" : "%lld PDF" } } } @@ -67759,7 +68746,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Photo" + "value" : "Đ¤ĐžŅ‚Đž" } }, "tr" : { @@ -68355,7 +69342,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You've reached the limit of %d pinned spaces." + "value" : "Đ’Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐģи ĐģиĐŧĐ¸Ņ‚Đ° ĐžĐąŅ‰Đ¸Ņ… ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛ %d." } }, "tr" : { @@ -69995,7 +70982,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Publish" + "value" : "ОĐŋŅƒĐąĐģиĐēĐžĐ˛Đ°Ņ‚ŅŒ" } }, "tr" : { @@ -70144,7 +71131,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Publish to Web" + "value" : "ОĐŋŅƒĐąĐģиĐēĐžĐ˛Đ°Ņ‚ŅŒ в вĐĩĐą" } }, "tr" : { @@ -70591,7 +71578,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Puzzle" + "value" : "Đ—Đ°Đ´Đ°Ņ‡Đ°" } }, "tr" : { @@ -70740,7 +71727,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Puzzles" + "value" : "Đ—Đ°Đ´Đ°Ņ‡Đ¸" } }, "tr" : { @@ -72780,25 +73767,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Relations" + "value" : "%lld ĐĄĐ˛ŅĐˇĐĩĐš" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Relations" + "value" : "%lld ĐĄĐ˛ŅĐˇĐĩĐš" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Relation" + "value" : "ĐĄĐ˛ŅĐˇŅŒ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Relations" + "value" : "%lld ĐĄĐ˛ŅĐˇĐ¸" } } } @@ -74454,7 +75441,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "í‚¤ė˛´ė¸ė—ė„œ 키ëĨŧ ëŗĩė›í•Šë‹ˆë‹¤" + "value" : "키 ė €ėžĨė†Œė—ė„œ 키ëĨŧ ëŗĩ뛐" } }, "nb" : { @@ -75093,7 +76080,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Scan documents" + "value" : "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ Đ´ĐžĐē҃ĐŧĐĩĐŊ҂ҋ" } }, "tr" : { @@ -76435,7 +77422,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You phone doesn’t have a passcode or biometric authorization. It might make it easier to steal your data. Enable it in your app settings to secure your data." + "value" : "ĐŖ Đ˛Đ°Ņ ĐŊĐĩŅ‚ ĐŋĐ°Ņ€ĐžĐģŅ иĐģи йиОĐŧĐĩŅ‚Ņ€Đ¸Ņ‡ĐĩҁĐēОК Đ°Đ˛Ņ‚ĐžŅ€Đ¸ĐˇĐ°Ņ†Đ¸Đ¸. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ОйĐģĐĩĐŗŅ‡Đ¸Ņ‚ŅŒ ĐēŅ€Đ°Đļ҃ Đ˛Đ°ŅˆĐ¸Ņ… даĐŊĐŊҋ҅. ВĐēĐģŅŽŅ‡Đ¸Ņ‚Đĩ ĐĩĐŗĐž в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊĐ¸Ņ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐˇĐ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚ŅŒ Đ˛Đ°ŅˆĐ¸ даĐŊĐŊŅ‹Đĩ." } }, "tr" : { @@ -76584,7 +77571,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Proceed anyway" + "value" : "Đ’ŅĐĩ Ņ€Đ°Đ˛ĐŊĐž ĐŋŅ€ĐžĐ´ĐžĐģĐļĐ¸Ņ‚ŅŒ" } }, "tr" : { @@ -76733,7 +77720,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Secure your phone" + "value" : "Đ—Đ°Ņ‰Đ¸Ņ‚Đ¸Ņ‚Đĩ Đ˛Đ°Ņˆ Ņ‚ĐĩĐģĐĩŅ„ĐžĐŊ" } }, "tr" : { @@ -76882,7 +77869,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "See all" + "value" : "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ĐĩŅ‚ŅŒ Đ˛ŅĐĩ" } }, "tr" : { @@ -77627,7 +78614,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Select Objects" + "value" : "Đ’Ņ‹ĐąĐžŅ€ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛" } }, "tr" : { @@ -78994,7 +79981,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Send" + "value" : "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ" } }, "tr" : { @@ -80635,7 +81622,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Set access" + "value" : "ĐŖŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ" } }, "tr" : { @@ -80933,7 +81920,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Query of %@" + "value" : "ЗаĐŋŅ€ĐžŅ %@" } }, "tr" : { @@ -81082,7 +82069,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Queries" + "value" : "ЗаĐŋŅ€ĐžŅŅ‹" } }, "tr" : { @@ -81380,7 +82367,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Auto Create Type Widgets" + "value" : "ĐĐ˛Ņ‚ĐžĐŧĐ°Ņ‚Đ¸Ņ‡ĐĩҁĐēи ŅĐžĐˇĐ´Đ°Đ˛Đ°Ņ‚ŅŒ видĐļĐĩ҂ҋ Ņ‚Đ¸Đŋа" } }, "tr" : { @@ -83801,6 +84788,155 @@ } } }, + "Show Description" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Show Description" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Mostrar descripciÃŗn" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Tampilkan Deskripsi" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Mostra Descrizione" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "네ëĒ… ëŗ´ę¸°" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "ПоĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ ĐžĐŋĐ¸ŅĐ°ĐŊиĐĩ" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "AÃ§ÄąklamayÄą GÃļster" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Show Description" + } + } + } + }, "Show types" : { "extractionState" : "manual", "localizations" : { @@ -87301,7 +88437,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ę˛°ė œė— ė‹¤íŒ¨í–ˆėŠĩ니다. 枰렜ëĨŧ ėœ„í•´ Apple ė¸Ąė—ė„œ ė‚ŦėšŠėž ėĄ°ėš˜ę°€ í•„ėš”í•Šë‹ˆë‹¤." + "value" : "枰렜 ė‹¤íŒ¨. ę˛°ė œí•˜ë ¤ëŠ´ Apple ė¸Ąė—ė„œ ė‚ŦėšŠėž ë™ėž‘ė´ í•„ėš”í•Šë‹ˆë‹¤." } }, "nb" : { @@ -88089,7 +89225,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "%@ deleted successfully" + "value" : "%@ ҃ҁĐŋĐĩ҈ĐŊĐž ŅƒĐ´Đ°ĐģĐĩĐŊ" } }, "tr" : { @@ -88721,6 +89857,155 @@ } } }, + "Syncing..." : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Syncing..." + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Sincronizandoâ€Ļ" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Syncing..." + } + } + } + }, "SyncStatus.Error.incompatibleVersion" : { "extractionState" : "manual", "localizations" : { @@ -90724,25 +92009,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Tags" + "value" : "%lld ĐĸŅĐŗĐžĐ˛" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Tags" + "value" : "%lld ĐĸŅĐŗĐžĐ˛" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Tag" + "value" : "%lld ĐĸŅĐŗ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Tags" + "value" : "%lld Ņ‚ŅĐŗĐžĐ˛" } } } @@ -92290,7 +93575,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Text Style" + "value" : "ĐĄŅ‚Đ¸ĐģҌ Ņ‚ĐĩĐēŅŅ‚Đ°" } }, "tr" : { @@ -94824,7 +96109,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "There are no spaces yet" + "value" : "Đ•Ņ‰Ņ‘ ĐŊĐĩŅ‚ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛" } }, "tr" : { @@ -95421,7 +96706,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "There is no property named %@" + "value" : "НĐĩŅ‚ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đ° ҁ иĐŧĐĩĐŊĐĩĐŧ %@" } }, "tr" : { @@ -96911,7 +98196,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Type Name" + "value" : "ИĐŧŅ Ņ‚Đ¸Đŋа" } }, "tr" : { @@ -98288,6 +99573,155 @@ } } }, + "Unlocked" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unlocked" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "Desprotegido" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Takterkunci" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Sbloccato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "ėž ę¸ˆ í•´ė œë¨" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "РаСйĐģĐžĐēĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐž" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "Kilidi aÃ§ÄąldÄą" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Unlocked" + } + } + } + }, "Unmute" : { "extractionState" : "manual", "localizations" : { @@ -98402,7 +99836,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unmute" + "value" : "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ĐˇĐ˛ŅƒĐē" } }, "tr" : { @@ -98586,6 +100020,155 @@ } } }, + "Unpinned" : { + "extractionState" : "manual", + "localizations" : { + "ar" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "be" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "de" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Unpinned" + } + }, + "es" : { + "stringUnit" : { + "state" : "new", + "value" : "No anclado" + } + }, + "fa" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "fi" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "id" : { + "stringUnit" : { + "state" : "new", + "value" : "Tak disemat" + } + }, + "it" : { + "stringUnit" : { + "state" : "new", + "value" : "Non fissato" + } + }, + "ja" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "ko" : { + "stringUnit" : { + "state" : "new", + "value" : "ęŗ ė • í•´ė œë¨" + } + }, + "nb" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "nl" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "or" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "pl" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "pt-BR" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "pt-PT" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "ru" : { + "stringUnit" : { + "state" : "new", + "value" : "ĐžŅ‚ĐēŅ€ĐĩĐŋĐģĐĩĐŊа" + } + }, + "tr" : { + "stringUnit" : { + "state" : "new", + "value" : "Sabitleme kaldÄąrÄąldÄą" + } + }, + "uk" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "vi" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + }, + "zh-Hant" : { + "stringUnit" : { + "state" : "new", + "value" : "Unpinned" + } + } + } + }, "Unpublish" : { "extractionState" : "manual", "localizations" : { @@ -98700,7 +100283,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unpublish" + "value" : "ĐžŅ‚ĐŧĐĩĐŊĐ¸Ņ‚ŅŒ ĐŋŅƒĐąĐģиĐēĐ°Ņ†Đ¸ŅŽ" } }, "tr" : { @@ -98849,7 +100432,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unread" + "value" : "НĐĩĐŋŅ€ĐžŅ‡Đ¸Ņ‚Đ°ĐŊĐŊŅ‹Đĩ" } }, "tr" : { @@ -99147,7 +100730,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unset as default" + "value" : "ĐŖĐąŅ€Đ°Ņ‚ŅŒ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ" } }, "tr" : { @@ -99296,7 +100879,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Unset default" + "value" : "ИСĐŧĐĩĐŊĐ¸Ņ‚ŅŒ СадаĐŊĐŊĐžĐĩ ĐŋĐž ҃ĐŧĐžĐģŅ‡Đ°ĐŊĐ¸ŅŽ СĐŊĐ°Ņ‡ĐĩĐŊиĐĩ" } }, "tr" : { @@ -101489,7 +103072,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ëŗ´ę´€ė†Œ ëŗĩ뛐 뤑 뗐ëŸŦ가 ë°œėƒí–ˆėŠĩ니다. ė¸í„°ë„ˇ ė—°ę˛°ė„ í™•ė¸í•´ėŖŧė„¸ėš”." + "value" : "ëŗ´ę´€ė†Œ ëŗĩ뛐 똤ëĨ˜, ė¸í„°ë„ˇ ė—°ę˛°ė„ í™•ė¸í•´ėŖŧė„¸ėš”." } }, "nb" : { @@ -102228,25 +103811,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "%lld Videos" + "value" : "%lld ВидĐĩĐž" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "%lld Videos" + "value" : "%lld ВидĐĩĐž" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "Video" + "value" : "ВидĐĩĐž" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "%lld Videos" + "value" : "%lld ВидĐĩĐž" } } } @@ -102601,7 +104184,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "View in Browser" + "value" : "ĐžŅ‚ĐēŅ€Ņ‹Ņ‚ŅŒ в ĐąŅ€Đ°ŅƒĐˇĐĩŅ€Đĩ" } }, "tr" : { @@ -104319,7 +105902,7 @@ "zero" : { "stringUnit" : { "state" : "new", - "value" : "Bin already empty" + "value" : "ĐšĐžŅ€ĐˇĐ¸ĐŊа ҃ĐļĐĩ ĐŋŅƒŅŅ‚Đ°" } } } @@ -105449,7 +107032,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Widget %@ was added" + "value" : "ВидĐļĐĩŅ‚ %@ дОйавĐģĐĩĐŊ" } }, "tr" : { @@ -108429,7 +110012,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "We’ve redesigned how widgets work, and this widget is no longer supported. Once deleted, this widget cannot be restored." + "value" : "ĐœŅ‹ иСĐŧĐĩĐŊиĐģи ҁĐŋĐžŅĐžĐą Ņ€Đ°ĐąĐžŅ‚Ņ‹ видĐļĐĩŅ‚ĐžĐ˛ и ŅŅ‚ĐžŅ‚ видĐļĐĩŅ‚ йОĐģҌ҈Đĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ. ĐŸĐžŅĐģĐĩ ŅƒĐ´Đ°ĐģĐĩĐŊĐ¸Ņ ŅŅ‚ĐžŅ‚ видĐļĐĩŅ‚ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ." } }, "tr" : { @@ -108578,7 +110161,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This Widget Cannot Be Restored" + "value" : "Đ­Ņ‚ĐžŅ‚ видĐļĐĩŅ‚ ĐŊĐĩ ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛ĐžŅŅŅ‚Đ°ĐŊОвĐģĐĩĐŊ" } }, "tr" : { @@ -109174,7 +110757,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You joined %@" + "value" : "Đ’Ņ‹ ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊиĐģĐ¸ŅŅŒ Đē %@" } }, "tr" : { diff --git a/Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings b/Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings index ff39b4943f..458e1ec240 100644 --- a/Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings +++ b/Modules/Loc/Sources/Loc/Resources/Workspace.xcstrings @@ -264,7 +264,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Failed to create file. Try again." + "value" : "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ŅĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ„Đ°ĐšĐģ. ĐŸĐžĐ˛Ņ‚ĐžŅ€Đ¸Ņ‚Đĩ ĐŋĐžĐŋҋ҂Đē҃." } }, "tr" : { @@ -413,7 +413,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Invalid file. Try again" + "value" : "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš Ņ„Đ°ĐšĐģ. ПоĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ" } }, "tr" : { @@ -811,25 +811,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "You can upload only %d attachments at a time" + "value" : "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž %d вĐģĐžĐļĐĩĐŊиК Са Ņ€Đ°Đˇ" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "You can upload only %d attachments at a time" + "value" : "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž %d вĐģĐžĐļĐĩĐŊиК Са Ņ€Đ°Đˇ" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "You can upload only %d attachment at a time" + "value" : "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž %d ВĐģĐžĐļĐĩĐŊиĐĩ Са Ņ€Đ°Đˇ" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "You can upload only %d attachments at a time" + "value" : "Đ’Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Ņ‚ĐžĐģҌĐēĐž %d вĐģĐžĐļĐĩĐŊиК Са Ņ€Đ°Đˇ" } } } @@ -1929,7 +1929,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Add members" + "value" : "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв" } }, "tr" : { @@ -2078,7 +2078,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Messages, docs & files available offline" + "value" : "ĐĄĐžĐžĐąŅ‰ĐĩĐŊĐ¸Ņ, Đ´ĐžĐē҃ĐŧĐĩĐŊ҂ҋ и Ņ„Đ°ĐšĐģŅ‹ Đ´ĐžŅŅ‚ŅƒĐŋĐŊŅ‹ ĐžŅ„Ņ„ĐģаКĐŊ" } }, "tr" : { @@ -2227,7 +2227,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Fully private and encrypted" + "value" : "ПоĐģĐŊĐžŅŅ‚ŅŒŅŽ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊŅ‹Đš и ĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš" } }, "tr" : { @@ -2376,7 +2376,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Yours forever" + "value" : "Đ’Đ°Ņˆ ĐŊĐ°Đ˛ŅĐĩĐŗĐ´Đ°" } }, "tr" : { @@ -2441,7 +2441,7 @@ "es" : { "stringUnit" : { "state" : "new", - "value" : "AÃēn no hay mensajes" + "value" : "Chat fuera de la nube" } }, "fa" : { @@ -2471,7 +2471,7 @@ "it" : { "stringUnit" : { "state" : "new", - "value" : "Nessun messaggio" + "value" : "Chatta senza il cloud" } }, "ja" : { @@ -2483,7 +2483,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "No messages yet" + "value" : "클ëŧėš°ë“œëĨŧ ęą°ėš˜ė§€ ė•ŠëŠ” ėą„íŒ…" } }, "nb" : { @@ -3121,7 +3121,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "We couldn’t connect right now. This may be due to no internet or a temporary sync issue. We’ll keep trying in the background." + "value" : "ĐœŅ‹ ĐŊĐĩ ҁĐŧĐžĐŗĐģи ĐŋОдĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒŅŅ в даĐŊĐŊŅ‹Đš ĐŧĐžĐŧĐĩĐŊŅ‚. Đ­Ņ‚Đž ĐŧĐžĐļĐĩŅ‚ ĐąŅ‹Ņ‚ŅŒ Đ˛Ņ‹ĐˇĐ˛Đ°ĐŊĐž ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛Đ¸ĐĩĐŧ иĐŊŅ‚ĐĩŅ€ĐŊĐĩŅ‚Đ° иĐģи Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊОК ŅĐ¸ĐŊŅ…Ņ€ĐžĐŊĐ¸ĐˇĐ°Ņ†Đ¸ĐĩĐš. ĐœŅ‹ ĐŋŅ€ĐžĐ´ĐžĐģĐļиĐŧ Ņ€Đ°ĐąĐžŅ‚Ņƒ в Ņ„ĐžĐŊОвОĐŧ Ņ€ĐĩĐļиĐŧĐĩ." } }, "tr" : { @@ -3419,7 +3419,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Network Error" + "value" : "ĐžŅˆĐ¸ĐąĐēа ҁĐĩŅ‚Đ¸" } }, "tr" : { @@ -5059,7 +5059,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Anytype now supports real-time chat in Shared Channels — so your thoughts and dialogues can grow together." + "value" : "Anytype Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ Ņ‡Đ°Ņ‚ в Ņ€ĐĩĐļиĐŧĐĩ Ņ€ĐĩаĐģҌĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи в ĐžĐąŅ‰Đ¸Ņ… ĐēаĐŊаĐģĐ°Ņ… — ĐŋĐžŅŅ‚ĐžĐŧ҃ Đ˛Đ°ŅˆĐ¸ ĐŧҋҁĐģи и диаĐģĐžĐŗĐ¸ ĐŧĐžĐŗŅƒŅ‚ Ņ€Đ°ŅŅ‚Đ¸ вĐŧĐĩҁ҂Đĩ." } }, "tr" : { @@ -5208,7 +5208,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Ideas need conversations" + "value" : "ИдĐĩи Ņ€ĐžĐļĐ´Đ°ŅŽŅ‚ŅŅ в диаĐģĐžĐŗĐĩ." } }, "tr" : { @@ -5357,7 +5357,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Spaces and Chats now show live previews and updates — one place to follow everything that matters." + "value" : "ĐŸŅ€ĐžĐąĐĩĐģŅ‹ и Ņ‡Đ°Ņ‚Ņ‹ Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ĐŋĐžĐēĐ°ĐˇŅ‹Đ˛Đ°ŅŽŅ‚ ĐļĐ¸Đ˛Ņ‹Đĩ ĐŋŅ€ĐĩĐ˛ŅŒŅŽ и ОйĐŊОвĐģĐĩĐŊĐ¸Ņ — ОдĐŊĐž ĐŧĐĩŅŅ‚Đž Đ´ĐģŅ Ņ‚ĐžĐŗĐž, Ņ‡Ņ‚ĐžĐąŅ‹ ҁĐģĐĩĐ´Đ¸Ņ‚ŅŒ Са Đ˛ŅĐĩĐŧ ĐŊĐĩĐžĐąŅ…ĐžĐ´Đ¸ĐŧŅ‹Đŧ." } }, "tr" : { @@ -5506,7 +5506,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Your Vault just leveled up" + "value" : "Đ’Đ°Ņˆ ĐĨŅ€Đ°ĐŊиĐģĐ¸Ņ‰Đĩ Ņ‚ĐžĐģҌĐēĐž Ņ‡Ņ‚Đž ĐŋĐžĐ˛Ņ‹ŅĐ¸ĐģĐžŅŅŒ" } }, "tr" : { @@ -5655,7 +5655,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Share ideas, drop docs, edit together — everything flows in real time." + "value" : "ДĐĩĐģĐ¸Ņ‚ĐĩҁҌ идĐĩŅĐŧи, ŅƒĐ´Đ°ĐģŅĐšŅ‚Đĩ Đ´ĐžŅĐēи, Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ŅƒĐšŅ‚Đĩ вĐŧĐĩҁ҂Đĩ — Đ˛ŅĐĩ ĐŋĐžŅ‚ĐžĐēи в Ņ€ĐĩĐļиĐŧĐĩ Ņ€ĐĩаĐģҌĐŊĐžĐŗĐž Đ˛Ņ€ĐĩĐŧĐĩĐŊи." } }, "tr" : { @@ -5804,7 +5804,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Chats that do more" + "value" : "Đ§Đ°Ņ‚Ņ‹, ĐēĐžŅ‚ĐžŅ€Ņ‹Đĩ Đ´ĐĩĐģĐ°ŅŽŅ‚ йОĐģҌ҈Đĩ" } }, "tr" : { @@ -5953,7 +5953,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Your pages, lists, and files — structured, surfaced, and always within reach." + "value" : "Đ’Đ°ŅˆĐ¸ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹, ҁĐŋĐ¸ŅĐēи и Ņ„Đ°ĐšĐģŅ‹ — ŅŅ‚Ņ€ŅƒĐēŅ‚ŅƒŅ€Đ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đĩ, ĐŋОвĐĩҀ҅ĐŊĐžŅŅ‚ĐŊŅ‹Đĩ и Đ˛ŅĐĩĐŗĐ´Đ° в ĐŋŅ€ĐĩĐ´ĐĩĐģĐ°Ņ… Đ´ĐžŅŅĐŗĐ°ĐĩĐŧĐžŅŅ‚Đ¸." } }, "tr" : { @@ -6102,7 +6102,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Everything in Its Right Place" + "value" : "Đ’ŅĐĩ в ĐŋŅ€Đ°Đ˛ĐžĐŧ ĐŧĐĩҁ҂Đĩ" } }, "tr" : { @@ -8338,7 +8338,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This inline query doesn’t have a source" + "value" : "Đ­Ņ‚ĐžŅ‚ Đ˛ŅŅ‚Ņ€ĐžĐĩĐŊĐŊŅ‹Đš СаĐŋŅ€ĐžŅ ĐŊĐĩ иĐŧĐĩĐĩŅ‚ Đ¸ŅŅ‚ĐžŅ‡ĐŊиĐēа" } }, "tr" : { @@ -9084,7 +9084,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Create Chat" + "value" : "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ‡Đ°Ņ‚" } }, "tr" : { @@ -14303,7 +14303,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Current year" + "value" : "ĐĸĐĩĐēŅƒŅ‰Đ¸Đš ĐŗĐžĐ´" } }, "tr" : { @@ -14899,7 +14899,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Last year" + "value" : "ĐŸŅ€ĐžŅˆĐģŅ‹Đš ĐŗĐžĐ´" } }, "tr" : { @@ -15346,7 +15346,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Next year" + "value" : "ĐĄĐģĐĩĐ´ŅƒŅŽŅ‰Đ¸Đš ĐŗĐžĐ´" } }, "tr" : { @@ -19125,7 +19125,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Add to the current type" + "value" : "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ в Ņ‚ĐĩĐēŅƒŅ‰Đ¸Đš Ņ‚Đ¸Đŋ" } }, "tr" : { @@ -19275,7 +19275,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Property ‘%@’ has been created" + "value" : "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đž ‘%@’ ĐąŅ‹ĐģĐž ŅĐžĐˇĐ´Đ°ĐŊĐž" } }, "tr" : { @@ -19424,7 +19424,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Found in objects" + "value" : "НайдĐĩĐŊĐž в ĐžĐąŅŠĐĩĐēŅ‚Đ°Ņ…" } }, "tr" : { @@ -19573,7 +19573,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Local" + "value" : "ЛоĐēаĐģҌĐŊŅ‹Đĩ" } }, "tr" : { @@ -19871,7 +19871,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "These properties exist in some objects but aren’t part of the Type. Add them to make them appear in all objects of this Type." + "value" : "Đ­Ņ‚Đ¸ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đ° ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‚ в ĐŊĐĩĐēĐžŅ‚ĐžŅ€Ņ‹Ņ… ĐžĐąŅŠĐĩĐēŅ‚Đ°Ņ…, ĐŊĐž ĐŊĐĩ ŅĐ˛ĐģŅŅŽŅ‚ŅŅ Ņ‡Đ°ŅŅ‚ŅŒŅŽ Ņ‚Đ¸Đŋа. Đ”ĐžĐąĐ°Đ˛ŅŒŅ‚Đĩ Đ¸Ņ…, Ņ‡Ņ‚ĐžĐąŅ‹ ĐžĐŊи ĐŋĐžŅĐ˛Đ¸ĐģĐ¸ŅŅŒ вО Đ˛ŅĐĩŅ… ĐžĐąŅŠĐĩĐēŅ‚Đ°Ņ… даĐŊĐŊĐžĐŗĐž Ņ‚Đ¸Đŋа." } }, "tr" : { @@ -20020,7 +20020,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Remove from the object" + "value" : "ĐŖĐ´Đ°ĐģĐ¸Ņ‚ŅŒ иС ĐžĐąŅŠĐĩĐēŅ‚Đ°" } }, "tr" : { @@ -20169,7 +20169,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Property ‘%@’ has been updated" + "value" : "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đž ‘%@’ ĐąŅ‹ĐģĐž ОйĐŊОвĐģĐĩĐŊĐž" } }, "tr" : { @@ -20467,7 +20467,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Join Space" + "value" : "Đ’ŅŅ‚ŅƒĐŋĐ¸Ņ‚ŅŒ в ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž" } }, "tr" : { @@ -20616,7 +20616,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Join Space Button" + "value" : "КĐŊĐžĐŋĐēа \"ĐŸŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Ņƒ\"" } }, "tr" : { @@ -28294,7 +28294,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This tier is not available in the app. We know it's not ideal." + "value" : "Đ­Ņ‚ĐžŅ‚ ŅƒŅ€ĐžĐ˛ĐĩĐŊҌ ĐŊĐĩĐ´ĐžŅŅ‚ŅƒĐŋĐĩĐŊ в ĐŋŅ€Đ¸ĐģĐžĐļĐĩĐŊии. ĐœŅ‹ СĐŊаĐĩĐŧ, Ņ‡Ņ‚Đž ŅŅ‚Đž ĐŊĐĩ идĐĩаĐģҌĐŊĐž." } }, "tr" : { @@ -30258,7 +30258,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Copy Plain Text" + "value" : "КоĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ĐžĐąŅ‹Ņ‡ĐŊŅ‹Đš Ņ‚ĐĩĐēҁ҂" } }, "tr" : { @@ -30556,7 +30556,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Mark Unread" + "value" : "ĐĄĐŊŅŅ‚ŅŒ ĐžŅ‚ĐŧĐĩŅ‚Đē҃ Đž ĐŋŅ€ĐžŅ‡Ņ‚ĐĩĐŊии" } }, "tr" : { @@ -31152,7 +31152,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Broadcast" + "value" : "ĐĸŅ€Đ°ĐŊҁĐģŅŅ†Đ¸Ņ" } }, "tr" : { @@ -31301,7 +31301,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "New Property" + "value" : "НовоĐĩ ŅĐ˛ĐžĐšŅŅ‚Đ˛Đž" } }, "tr" : { @@ -31599,7 +31599,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Notifications" + "value" : "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -34135,7 +34135,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Failed to load your domain. Please try again." + "value" : "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ Đ˛Đ°Ņˆ Đ´ĐžĐŧĐĩĐŊ. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ." } }, "tr" : { @@ -34284,7 +34284,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Failed to load object data. Please try again." + "value" : "НĐĩ ŅƒĐ´Đ°ĐģĐžŅŅŒ ĐˇĐ°ĐŗŅ€ŅƒĐˇĐ¸Ņ‚ŅŒ даĐŊĐŊŅ‹Đĩ ĐžĐąŅŠĐĩĐēŅ‚Đ°. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžĐąŅƒĐšŅ‚Đĩ Đĩ҉Đĩ Ņ€Đ°Đˇ." } }, "tr" : { @@ -34433,7 +34433,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "insert-page-name-here" + "value" : "Đ˛ŅŅ‚Đ°Đ˛Đ¸Ņ‚ŅŒ иĐŧŅ ŅŅ‚Ņ€Đ°ĐŊĐ¸Ņ†Ņ‹-СдĐĩҁҌ" } }, "tr" : { @@ -34582,7 +34582,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This object is live on the web." + "value" : "Đ­Ņ‚ĐžŅ‚ ĐžĐąŅŠĐĩĐēŅ‚ ĐļивĐĩŅ‚ в ИĐŊŅ‚ĐĩŅ€ĐŊĐĩŅ‚Đĩ." } }, "tr" : { @@ -34731,7 +34731,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "View site â†—ī¸Ž" + "value" : "ĐŸŅ€ĐžŅĐŧĐžŅ‚Ņ€ ŅĐ°ĐšŅ‚Đ° â†—ī¸" } }, "tr" : { @@ -34880,7 +34880,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Successfully published" + "value" : "ĐŖŅĐŋĐĩ҈ĐŊĐž ĐžĐŋŅƒĐąĐģиĐēОваĐŊĐž" } }, "tr" : { @@ -35029,7 +35029,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Successfully unpublished" + "value" : "ĐŸŅƒĐąĐģиĐēĐ°Ņ†Đ¸Ņ ҃ҁĐŋĐĩ҈ĐŊĐž ĐžŅ‚ĐŧĐĩĐŊĐĩĐŊа." } }, "tr" : { @@ -35178,7 +35178,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Successfully updated" + "value" : "ĐŖŅĐŋĐĩ҈ĐŊĐž ОйĐŊОвĐģĐĩĐŊĐž" } }, "tr" : { @@ -35327,7 +35327,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "It looks like you didn’t allow notifications. That means you won’t see new messages, mentions, or invites. Go to settings to turn them on." + "value" : "ĐŸĐžŅ…ĐžĐļĐĩ, Đ˛Ņ‹ ĐŊĐĩ Ņ€Đ°ĐˇŅ€ĐĩŅˆĐ°Đģи ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ. Đ­Ņ‚Đž ОСĐŊĐ°Ņ‡Đ°ĐĩŅ‚, Ņ‡Ņ‚Đž Đ˛Ņ‹ ĐŊĐĩ ŅƒĐ˛Đ¸Đ´Đ¸Ņ‚Đĩ ĐŊĐžĐ˛Ņ‹Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊиК, ҃ĐŋĐžĐŧиĐŊаĐŊиК иĐģи ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊиК. ПĐĩŅ€ĐĩĐšĐ´Đ¸Ņ‚Đĩ в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēи, Ņ‡Ņ‚ĐžĐąŅ‹ вĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Đ¸Ņ…." } }, "tr" : { @@ -35476,7 +35476,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Skip for now" + "value" : "ĐŸŅ€ĐžĐŋŅƒŅŅ‚Đ¸Ņ‚ŅŒ" } }, "tr" : { @@ -35625,7 +35625,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Notifications are still turned off" + "value" : "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ ĐŋĐž-ĐŋŅ€ĐĩĐļĐŊĐĩĐŧ҃ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊŅ‹" } }, "tr" : { @@ -35774,7 +35774,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Attachment" + "value" : "ВĐģĐžĐļĐĩĐŊиĐĩ" } }, "tr" : { @@ -35923,7 +35923,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Get notified instantly when someone messages or mentions you in your spaces." + "value" : "ПоĐģŅƒŅ‡Đ°ĐšŅ‚Đĩ ĐŧĐŗĐŊОвĐĩĐŊĐŊĐžĐĩ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊиĐĩ, ĐēĐžĐŗĐ´Đ° ĐēŅ‚Đž-Ņ‚Đž ҃ĐŋĐžĐŧиĐŊаĐĩŅ‚ Đ˛Đ°Ņ в ŅĐ˛ĐžĐ¸Ņ… ĐŧĐĩŅŅ‚Đ°Ņ…." } }, "tr" : { @@ -36072,7 +36072,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "New Message" + "value" : "НовоĐĩ ŅĐžĐžĐąŅ‰ĐĩĐŊиĐĩ" } }, "tr" : { @@ -36221,7 +36221,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Enable notifications" + "value" : "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -36519,7 +36519,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Turn on push notifications" + "value" : "ВĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ Push-ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -36668,7 +36668,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Receive notifications about new messages by enabling them in your device settings." + "value" : "ПоĐģŅƒŅ‡Đ°Ņ‚ŅŒ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ Đž ĐŊĐžĐ˛Ņ‹Ņ… ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸ŅŅ…, вĐēĐģŅŽŅ‡Đ¸Đ˛ Đ¸Ņ… в ĐŊĐ°ŅŅ‚Ņ€ĐžĐšĐēĐ°Ņ… ŅƒŅŅ‚Ņ€ĐžĐšŅŅ‚Đ˛Đ°." } }, "tr" : { @@ -36817,7 +36817,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Notifications are disabled" + "value" : "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊŅ‹" } }, "tr" : { @@ -36966,7 +36966,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Message Notifications" + "value" : "ĐŖĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ Đž ŅĐžĐžĐąŅ‰ĐĩĐŊĐ¸ŅŅ…" } }, "tr" : { @@ -37115,7 +37115,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Join via QR Code" + "value" : "ĐŸŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ ҇ĐĩŅ€ĐĩС QR-ĐēОд" } }, "tr" : { @@ -37264,7 +37264,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Scanning error" + "value" : "ĐĄĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ ĐŊĐĩ ĐŋОддĐĩŅ€ĐļиваĐĩŅ‚ŅŅ" } }, "tr" : { @@ -37413,7 +37413,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The scanned QR code contains URL in invalid format" + "value" : "ĐžŅ‚ŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš QR-ĐēОд ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ URL в ĐŊĐĩвĐĩŅ€ĐŊĐžĐŧ Ņ„ĐžŅ€ĐŧĐ°Ņ‚Đĩ" } }, "tr" : { @@ -37562,7 +37562,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Invalid QR Code" + "value" : "НĐĩĐ´ĐžĐŋŅƒŅŅ‚Đ¸ĐŧŅ‹Đš QR-ĐēОд" } }, "tr" : { @@ -37711,7 +37711,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The scanned QR code doesn't contain a valid URL" + "value" : "ĐžŅ‚ŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš QR-ĐēОд ĐŊĐĩ ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ‚ĐĩĐģҌĐŊŅ‹Đš URL" } }, "tr" : { @@ -38009,7 +38009,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The scanned QR code contains different action" + "value" : "ĐžŅ‚ŅĐēаĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊĐŊŅ‹Đš QR-ĐēОд ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ Đ´Ņ€ŅƒĐŗĐžĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Đĩ" } }, "tr" : { @@ -40095,7 +40095,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Relation object" + "value" : "ĐžĐąŅŠĐĩĐēŅ‚ ŅĐ˛ŅĐˇĐ¸" } }, "tr" : { @@ -40947,7 +40947,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "%@ ėœ í˜•ėœŧ로 ëļ€í„°" + "value" : "%@ ėœ í˜•ėœŧ로ëļ€í„°" } }, "nb" : { @@ -41735,7 +41735,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Obsidian" + "value" : "ĐžĐąŅĐ¸Đ´Đ¸Đ°ĐŊ" } }, "tr" : { @@ -42587,7 +42587,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "ę°ė˛´ ėœ í˜•:" + "value" : "ė˜¤ë¸Œė íŠ¸ ėœ í˜•:" } }, "nb" : { @@ -46805,7 +46805,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Property:" + "value" : "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đž:" } }, "tr" : { @@ -46954,7 +46954,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Properties:" + "value" : "ĐĄĐ˛ĐžĐšŅŅ‚Đ˛Đ°:" } }, "tr" : { @@ -47850,7 +47850,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Add search query to aggregate objects with equal types and properties in a live mode" + "value" : "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐŋĐžĐ¸ŅĐēĐžĐ˛Ņ‹Đš СаĐŋŅ€ĐžŅ в Đ°ĐŗŅ€ĐĩĐŗĐ°Ņ†Đ¸ŅŽ ĐžĐąŅŠĐĩĐēŅ‚ĐžĐ˛ ҁ ОдиĐŊаĐēĐžĐ˛Ņ‹Đŧи Ņ‚Đ¸ĐŋаĐŧи и ŅĐ˛ĐžĐšŅŅ‚Đ˛Đ°Đŧи в ĐļивОĐŧ Ņ€ĐĩĐļиĐŧĐĩ" } }, "tr" : { @@ -50237,7 +50237,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "No properties" + "value" : "НĐĩŅ‚ ŅĐ˛ĐžĐšŅŅ‚Đ˛" } }, "tr" : { @@ -50983,7 +50983,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Add a comment..." + "value" : "Đ”ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ ĐēĐžĐŧĐŧĐĩĐŊŅ‚Đ°Ņ€Đ¸Đš..." } }, "tr" : { @@ -51282,7 +51282,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Select destination" + "value" : "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ Đŋ҃ĐŊĐēŅ‚ ĐŊаСĐŊĐ°Ņ‡ĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -51431,7 +51431,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Send to chat" + "value" : "ĐžŅ‚ĐŋŅ€Đ°Đ˛Đ¸Ņ‚ŅŒ в Ņ‡Đ°Ņ‚" } }, "tr" : { @@ -52326,7 +52326,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Select Space" + "value" : "Đ’Ņ‹ĐąĐĩŅ€Đ¸Ņ‚Đĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž" } }, "tr" : { @@ -53072,7 +53072,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Upgrade your membership to invite more members." + "value" : "ĐŖĐģŅƒŅ‡ŅˆĐ¸Ņ‚Đĩ ҇ĐģĐĩĐŊŅŅ‚Đ˛Đž, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋŅ€Đ¸ĐŗĐģĐ°ŅĐ¸Ņ‚ŅŒ йОĐģҌ҈Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēОв." } }, "tr" : { @@ -53221,7 +53221,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You've reached the limit of %lld editors." + "value" : "Đ’Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐģи ĐģиĐŧĐ¸Ņ‚Đ° Ņ€ĐĩдаĐēŅ‚ĐžŅ€ĐžĐ˛ %lld." } }, "tr" : { @@ -53370,7 +53370,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Upgrade for more or remove spaces." + "value" : "ĐŖĐģŅƒŅ‡ŅˆĐ¸Ņ‚Đĩ Đ´ĐģŅ йОĐģĐĩĐĩ иĐģи ŅƒĐ´Đ°ĐģĐ¸Ņ‚Đĩ ĐŋŅ€ĐžĐąĐĩĐģŅ‹." } }, "tr" : { @@ -53519,7 +53519,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You've reached the limit of %lld shared spaces." + "value" : "Đ’Ņ‹ Đ´ĐžŅŅ‚Đ¸ĐŗĐģи ĐģиĐŧĐ¸Ņ‚Đ° ĐžĐąŅ‰Đ¸Ņ… ĐŋŅ€ĐžĐąĐĩĐģОв Đ´ĐģŅ %lld." } }, "tr" : { @@ -53668,7 +53668,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "People with link can edit and write in chat" + "value" : "Đ›ŅŽĐ´Đ¸ ŅĐž ҁҁҋĐģĐēОК ĐŧĐžĐŗŅƒŅ‚ Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ и ĐŋĐ¸ŅĐ°Ņ‚ŅŒ в Ņ‡Đ°Ņ‚Đĩ" } }, "tr" : { @@ -53817,7 +53817,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Editor access" + "value" : "ĐŸŅ€Đ°Đ˛Đ° ĐŊа Ņ€ĐĩдаĐēŅ‚Đ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ" } }, "tr" : { @@ -53966,7 +53966,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Only already invited members have access" + "value" : "ĐĸĐžĐģҌĐēĐž ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊĐŊŅ‹Đĩ ŅƒŅ‡Đ°ŅŅ‚ĐŊиĐēи иĐŧĐĩŅŽŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋ" } }, "tr" : { @@ -54115,7 +54115,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Link disabled" + "value" : "ĐĄŅŅ‹ĐģĐēа ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊа" } }, "tr" : { @@ -54264,7 +54264,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Owner must approve each join request" + "value" : "ВĐģадĐĩĐģĐĩ҆ Đ´ĐžĐģĐļĐĩĐŊ ĐžĐ´ĐžĐąŅ€Đ¸Ņ‚ŅŒ ĐēаĐļĐ´Ņ‹Đš СаĐŋŅ€ĐžŅ ĐŊа ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐĩĐŊиĐĩ" } }, "tr" : { @@ -54413,7 +54413,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Request access" + "value" : "ЗаĐŋŅ€ĐžŅĐ¸Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ" } }, "tr" : { @@ -54562,7 +54562,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "People with link can view and read chat" + "value" : "Đ›ŅŽĐ´Đ¸ ŅĐž ҁҁҋĐģĐēОК ĐŧĐžĐŗŅƒŅ‚ ĐŋŅ€ĐžŅĐŧĐ°Ņ‚Ņ€Đ¸Đ˛Đ°Ņ‚ŅŒ и Ņ‡Đ¸Ņ‚Đ°Ņ‚ŅŒ Ņ‡Đ°Ņ‚" } }, "tr" : { @@ -54711,7 +54711,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Viewer access" + "value" : "ĐŸŅ€Đ°Đ˛Đ° ĐŊа ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€" } }, "tr" : { @@ -55333,7 +55333,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "All activity" + "value" : "Đ’ŅĐĩ Đ´ĐĩĐšŅŅ‚Đ˛Đ¸Ņ" } }, "tr" : { @@ -55482,7 +55482,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Disable notifications" + "value" : "Đ’Ņ‹ĐēĐģŅŽŅ‡Đ¸Ņ‚ŅŒ ŅƒĐ˛ĐĩĐ´ĐžĐŧĐģĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -55631,7 +55631,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Mentions only" + "value" : "ĐĸĐžĐģҌĐēĐž ҃ĐŋĐžĐŧиĐŊаĐŊĐ¸Ņ" } }, "tr" : { @@ -57421,7 +57421,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Create a chat" + "value" : "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ‡Đ°Ņ‚" } }, "tr" : { @@ -57719,7 +57719,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Create a stream" + "value" : "ĐĄĐžĐˇĐ´Đ°Ņ‚ŅŒ Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Đ¸ŅŽ" } }, "tr" : { @@ -57868,7 +57868,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "If you switch link type, your existing link will be deactivated." + "value" : "Đ•ŅĐģи Đ˛Ņ‹ ĐŋĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ°ĐĩŅ‚ĐĩҁҌ ĐŊа Ņ‚Đ¸Đŋ ҁҁҋĐģĐēи, Đ˛Đ°ŅˆĐ° ŅŅƒŅ‰ĐĩŅŅ‚Đ˛ŅƒŅŽŅ‰Đ°Ņ ҁҁҋĐģĐēа ĐąŅƒĐ´ĐĩŅ‚ ĐžŅ‚ĐēĐģŅŽŅ‡ĐĩĐŊа." } }, "tr" : { @@ -58017,7 +58017,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The current link will stop working" + "value" : "ĐĸĐĩĐēŅƒŅ‰Đ°Ņ ҁҁҋĐģĐēа ĐŋĐĩŅ€ĐĩŅŅ‚Đ°ĐŊĐĩŅ‚ Ņ€Đ°ĐąĐžŅ‚Đ°Ņ‚ŅŒ" } }, "tr" : { @@ -58721,7 +58721,7 @@ "ko" : { "stringUnit" : { "state" : "new", - "value" : "Default Space" + "value" : "ę¸°ëŗ¸ ėŠ¤íŽ˜ė´ėŠ¤" } }, "nb" : { @@ -59270,7 +59270,7 @@ "en" : { "stringUnit" : { "state" : "translated", - "value" : "Spaces" + "value" : "Channels" } }, "es" : { @@ -59306,7 +59306,7 @@ "it" : { "stringUnit" : { "state" : "new", - "value" : "Spazi" + "value" : "Canali" } }, "ja" : { @@ -59324,7 +59324,7 @@ "nb" : { "stringUnit" : { "state" : "new", - "value" : "Rom" + "value" : "Channels" } }, "nl" : { @@ -59509,7 +59509,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Group chat with shared data. Best for small groups or a single ongoing conversation." + "value" : "Đ“Ņ€ŅƒĐŋĐŋОвОК Ņ‡Đ°Ņ‚ ҁ ĐžĐąŅ‰Đ¸Đŧи даĐŊĐŊŅ‹Đŧи. Đ›ŅƒŅ‡ŅˆĐĩ Đ˛ŅĐĩĐŗĐž Đ´ĐģŅ ĐŊĐĩйОĐģŅŒŅˆĐ¸Ņ… ĐŗŅ€ŅƒĐŋĐŋ иĐģи Đ´ĐģŅ ОдĐŊОК ĐŋĐžŅŅ‚ĐžŅĐŊĐŊОК ĐąĐĩҁĐĩĐ´Ņ‹." } }, "tr" : { @@ -59956,7 +59956,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Hub for advanced data management. Multi-chats by topic coming soon. Ideal for larger teams." + "value" : "ĐĨай Đ´ĐģŅ Ņ€Đ°ŅŅˆĐ¸Ņ€ĐĩĐŊĐŊĐžĐŗĐž ҃ĐŋŅ€Đ°Đ˛ĐģĐĩĐŊĐ¸Ņ даĐŊĐŊŅ‹Đŧи. ĐœŅƒĐģŅŒŅ‚Đ¸-Ņ‡Đ°Ņ‚Ņ‹ ҁĐēĐžŅ€Đž ĐŋĐžŅĐ˛ŅŅ‚ŅŅ. ИдĐĩаĐģҌĐŊĐž ĐŋĐžĐ´Ņ…ĐžĐ´Đ¸Ņ‚ Đ´ĐģŅ йОĐģŅŒŅˆĐ¸Ņ… ĐēĐžĐŧаĐŊĐ´." } }, "tr" : { @@ -60403,7 +60403,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "For broadcasting your vibe" + "value" : "ДĐģŅ Ņ‚Ņ€Đ°ĐŊҁĐģŅŅ†Đ¸Đ¸ Đ˛Đ°ŅˆĐĩĐŗĐž vibe" } }, "tr" : { @@ -60552,7 +60552,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Stream" + "value" : "ĐĄŅ‚Ņ€Đ¸Đŧ" } }, "tr" : { @@ -63384,7 +63384,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Copy invite link" + "value" : "ĐĄĐēĐžĐŋĐ¸Ņ€ĐžĐ˛Đ°Ņ‚ŅŒ ҁҁҋĐģĐē҃ Đ´ĐģŅ ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊĐ¸Ņ" } }, "tr" : { @@ -64427,7 +64427,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Share this invite link so that others can join your space" + "value" : "ПодĐĩĐģĐ¸Ņ‚ĐĩҁҌ ŅŅ‚ĐžĐš ҁҁҋĐģĐēОК-ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊиĐĩĐŧ, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŧĐžĐŗĐģи ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē ваĐŧ" } }, "tr" : { @@ -64576,7 +64576,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Once they click your link and request access, you can set their access rights." + "value" : "КаĐē Ņ‚ĐžĐģҌĐēĐž ĐžĐŊи ĐŋĐĩŅ€ĐĩĐšĐ´ŅƒŅ‚ ĐŋĐž ҁҁҋĐģĐēĐĩ и ĐˇĐ°Ņ…ĐžŅ‚ŅŅ‚ ĐŋĐžĐģŅƒŅ‡Đ¸Ņ‚ŅŒ Đ´ĐžŅŅ‚ŅƒĐŋ, Đ˛Ņ‹ ĐŧĐžĐļĐĩŅ‚Đĩ ŅƒŅŅ‚Đ°ĐŊĐžĐ˛Đ¸Ņ‚ŅŒ Đ¸Ņ… ĐŋŅ€Đ°Đ˛Đ° Đ´ĐžŅŅ‚ŅƒĐŋа." } }, "tr" : { @@ -65639,7 +65639,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Share this link so that others can join your Stream." + "value" : "ПодĐĩĐģĐ¸Ņ‚ĐĩҁҌ ŅŅ‚ĐžĐš ҁҁҋĐģĐēОК, Ņ‡Ņ‚ĐžĐąŅ‹ Đ´Ņ€ŅƒĐŗĐ¸Đĩ ĐŧĐžĐŗĐģи ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē Đ˛Đ°ŅˆĐĩĐŧ҃ ĐŋĐžŅ‚ĐžĐē҃." } }, "tr" : { @@ -66384,7 +66384,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The link you are using does not seem to work. Please ask the owner to share a new one with you." + "value" : "ĐĄŅŅ‹ĐģĐēа, ĐēĐžŅ‚ĐžŅ€ŅƒŅŽ Đ˛Ņ‹ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒĐĩŅ‚Đĩ, ĐŊĐĩ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚. ПоĐļаĐģŅƒĐšŅŅ‚Đ°, ĐŋĐžĐŋŅ€ĐžŅĐ¸Ņ‚Đĩ вĐģадĐĩĐģŅŒŅ†Đ° ĐŋОдĐĩĐģĐ¸Ņ‚ŅŒŅŅ ҁ ваĐŧи ĐŊОвОК ҁҁҋĐģĐēОК." } }, "tr" : { @@ -66533,7 +66533,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "To join as an editor, ask the owner to add more editor seats or send you a new link with view-only access." + "value" : "Đ§Ņ‚ĐžĐąŅ‹ ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē Ņ€ĐĩдаĐēŅ‚ĐžŅ€Ņƒ, ĐŋĐžĐŋŅ€ĐžŅĐ¸Ņ‚Đĩ вĐģадĐĩĐģŅŒŅ†Đ° Đ´ĐžĐąĐ°Đ˛Đ¸Ņ‚ŅŒ йОĐģҌ҈Đĩ ĐŧĐĩҁ҂ Đ´ĐģŅ Ņ€ĐĩдаĐēŅ‚ĐžŅ€Đ° иĐģи ĐžŅ‚ĐŋŅ€Đ°Đ˛ŅŒŅ‚Đĩ ваĐŧ ĐŊĐžĐ˛ŅƒŅŽ ҁҁҋĐģĐē҃ ҁ Đ´ĐžŅŅ‚ŅƒĐŋĐžĐŧ Ņ‚ĐžĐģҌĐēĐž Đ´ĐģŅ ĐŋŅ€ĐžŅĐŧĐžŅ‚Ņ€Đ°." } }, "tr" : { @@ -66682,7 +66682,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This space has reached its limit" + "value" : "Đ”ĐžŅŅ‚Đ¸ĐŗĐŊŅƒŅ‚ ĐģиĐŧĐ¸Ņ‚ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đ°" } }, "tr" : { @@ -66980,7 +66980,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "No access to this space" + "value" : "НĐĩŅ‚ Đ´ĐžŅŅ‚ŅƒĐŋа Đē ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Ņƒ" } }, "tr" : { @@ -67129,7 +67129,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Join Space" + "value" : "Đ’ŅŅ‚ŅƒĐŋĐ¸Ņ‚ŅŒ в ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž" } }, "tr" : { @@ -67278,7 +67278,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You've been invited to join %@, created by %@" + "value" : "Đ’Ņ‹ ĐąŅ‹Đģи ĐŋŅ€Đ¸ĐŗĐģĐ°ŅˆĐĩĐŊŅ‹ ĐŋŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē %@ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Ņƒ, ŅĐžĐˇĐ´Đ°ĐŊĐŊĐžĐŧ҃ %@" } }, "tr" : { @@ -67427,7 +67427,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Join %@" + "value" : "ĐŸŅ€Đ¸ŅĐžĐĩдиĐŊĐ¸Ņ‚ŅŒŅŅ Đē ÂĢ%@Âģ" } }, "tr" : { @@ -67576,7 +67576,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Ask the owner to share it with you." + "value" : "ПоĐŋŅ€ĐžŅĐ¸Ņ‚Đĩ вĐģадĐĩĐģŅŒŅ†Đ° ĐŋОдĐĩĐģĐ¸Ņ‚ŅŒŅŅ иĐŧ ҁ ваĐŧи." } }, "tr" : { @@ -70880,7 +70880,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Share link" + "value" : "ПодĐĩĐģĐ¸Ņ‚ŅŒŅŅ ҁҁҋĐģĐēОК" } }, "tr" : { @@ -71625,7 +71625,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "You’ve removed the last member, so this space is now private and only accessible to you." + "value" : "Đ’Ņ‹ ŅƒĐ´Đ°ĐģиĐģи ĐŋĐžŅĐģĐĩĐ´ĐŊĐĩĐŗĐž ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ, Ņ‚Đ°Đē Ņ‡Ņ‚Đž Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ŅŅ‚Đž ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊĐžĐĩ ĐŋŅ€ĐžŅŅ‚Ņ€Đ°ĐŊŅŅ‚Đ˛Đž и Đ´ĐžŅŅ‚ŅƒĐŋĐŊĐž Ņ‚ĐžĐģҌĐēĐž ваĐŧ." } }, "tr" : { @@ -71774,7 +71774,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "The space is now private" + "value" : "ОбĐģĐ°ŅŅ‚ŅŒ Ņ‚ĐĩĐŋĐĩŅ€ŅŒ ĐŋŅ€Đ¸Đ˛Đ°Ņ‚ĐŊа" } }, "tr" : { @@ -73414,7 +73414,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "Invite people and start sharing your vibe" + "value" : "ĐŸŅ€Đ¸ĐŗĐģĐ°ŅĐ¸Ņ‚Đĩ ĐģŅŽĐ´ĐĩĐš и ĐŊĐ°Ņ‡ĐŊĐ¸Ņ‚Đĩ Đ´ĐĩĐģĐ¸Ņ‚ŅŒŅŅ ŅĐ˛ĐžĐ¸Đŧ ваКйОĐŧ" } }, "tr" : { @@ -73563,7 +73563,7 @@ "ru" : { "stringUnit" : { "state" : "new", - "value" : "This stream is empty" + "value" : "Đ­Ņ‚ĐžŅ‚ ĐŋĐžŅ‚ĐžĐē ĐŋŅƒŅŅ‚" } }, "tr" : { @@ -75005,25 +75005,25 @@ "few" : { "stringUnit" : { "state" : "new", - "value" : "This type has %d templates" + "value" : "Đ­Ņ‚ĐžŅ‚ Ņ‚Đ¸Đŋ ŅˆĐ°ĐąĐģĐžĐŊа иĐŧĐĩĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ %d" } }, "many" : { "stringUnit" : { "state" : "new", - "value" : "This type has %d templates" + "value" : "Đ­Ņ‚ĐžŅ‚ Ņ‚Đ¸Đŋ ŅˆĐ°ĐąĐģĐžĐŊа иĐŧĐĩĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ %d" } }, "one" : { "stringUnit" : { "state" : "new", - "value" : "This type has %d template" + "value" : "Đ­Ņ‚ĐžŅ‚ Ņ‚Đ¸Đŋ ŅˆĐ°ĐąĐģĐžĐŊа иĐŧĐĩĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊ %d" } }, "other" : { "stringUnit" : { "state" : "new", - "value" : "This type has %d templates" + "value" : "Đ­Ņ‚ĐžŅ‚ Ņ‚Đ¸Đŋ ŅˆĐ°ĐąĐģĐžĐŊа иĐŧĐĩĐĩŅ‚ ŅˆĐ°ĐąĐģĐžĐŊŅ‹ %d" } } } diff --git a/Modules/ProtobufMessages/Scripts/generate.sh b/Modules/ProtobufMessages/Scripts/generate.sh index 8d5994ca2f..a953eb4172 100755 --- a/Modules/ProtobufMessages/Scripts/generate.sh +++ b/Modules/ProtobufMessages/Scripts/generate.sh @@ -1,6 +1,8 @@ #!/usr/bin/env bash + SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +${SCRIPT_DIR}/generate_models.sh # ./Tools/SwiftGen/swiftgen config run --config ${SCRIPT_DIR}/Configs/swiftgen.yml ./build/sourcery --config ${SCRIPT_DIR}/Loc/sourcery.yml diff --git a/Modules/ProtobufMessages/Scripts/generate_models.sh b/Modules/ProtobufMessages/Scripts/generate_models.sh new file mode 100755 index 0000000000..ad44af56e5 --- /dev/null +++ b/Modules/ProtobufMessages/Scripts/generate_models.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash + + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +MODULE_DIR=${SCRIPT_DIR}/.. +ROOT_DIR=${SCRIPT_DIR}/../../.. + +# Generate models from protoc + +PROTO_PATH=${ROOT_DIR}/Dependencies/Middleware/protobuf/protos +PROTO_OUT=${ROOT_DIR}/Dependencies/Middleware/genmodels + +mkdir -p ${PROTO_OUT} +rm -rf ${PROTO_OUT}/* + +find "$PROTO_PATH" -name '*.proto' | while read -r file; do + # import "some/models.proto" -> import "models.proto" + sed -i.bak -E \ + '/import[[:space:]]+"google\/protobuf\//! s#(import[[:space:]]+")([^"/]+/)*([^"/]+\.proto)"#\1\3"#g' \ + "$file" +done + +protoc --plugin=protoc-gen-swift="${ROOT_DIR}/build/swift-protobuf/.build/release/protoc-gen-swift" --swift_opt=FileNaming=DropPath --swift_opt=Visibility=Public --swift_out="${PROTO_OUT}" --proto_path="${PROTO_PATH}" ${PROTO_PATH}/*.proto + +# Split files and copy + +rm -rf ${MODULE_DIR}/Sources/Protocol/* +./build/anytype-swift-filesplit-v1 --path ${PROTO_OUT}/commands.pb.swift --output-dir ${MODULE_DIR}/Sources/Protocol/Commands --other-name CommandsOther.swift +./build/anytype-swift-filesplit-v1 --path ${PROTO_OUT}/events.pb.swift --output-dir ${MODULE_DIR}/Sources/Protocol/Events --other-name EventsOther.swift +./build/anytype-swift-filesplit-v1 --path ${PROTO_OUT}/models.pb.swift --output-dir ${MODULE_DIR}/Sources/Protocol/Models --other-name ModelsOther.swift --max-depth 4 +cp -r ${PROTO_OUT}/localstore.pb.swift ${MODULE_DIR}/Sources/Protocol + diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Empty.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Empty.swift index 120c2d0a71..9a636a3144 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Empty.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Empty.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Autofill.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Autofill.swift index f56cfbb8c4..f773c36eb4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Autofill.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Autofill.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ListSummary.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ListSummary.swift index 70c3c58449..a587c6b20e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ListSummary.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ListSummary.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ObjectCreateFromUrl.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ObjectCreateFromUrl.swift index 9870e055b1..a2b51db3ab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ObjectCreateFromUrl.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ObjectCreateFromUrl.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Provider.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Provider.swift index cb6298bd2d..3ee41e3c18 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Provider.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.Provider.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ProviderConfig.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ProviderConfig.swift index 6d6c5638d0..25ba28d395 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ProviderConfig.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.ProviderConfig.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.WritingTools.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.WritingTools.swift index 173a173f7d..6fbd0a63ef 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.WritingTools.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.WritingTools.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.swift index 7dd5b5a80e..29c414c4e4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.AI.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeJsonApiAddr.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeJsonApiAddr.swift index 51baadb9ee..448c3f088c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeJsonApiAddr.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeJsonApiAddr.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeNetworkConfigAndRestart.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeNetworkConfigAndRestart.swift index 295d5056d3..8bfc832074 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeNetworkConfigAndRestart.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ChangeNetworkConfigAndRestart.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Config.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Config.swift index c5e988c114..583112525b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Config.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Config.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ConfigUpdate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ConfigUpdate.swift index 87647b310a..fb3faa6d17 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ConfigUpdate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.ConfigUpdate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Create.swift index 617f5b4e0d..d495349393 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Delete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Delete.swift index 92e45f0fca..d44976fea3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Delete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Delete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.EnableLocalNetworkSync.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.EnableLocalNetworkSync.swift index def33a6dfc..d897d10292 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.EnableLocalNetworkSync.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.EnableLocalNetworkSync.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.GetConfig.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.GetConfig.swift index df62ff13a4..f18553d0ae 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.GetConfig.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.GetConfig.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.LocalLink.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.LocalLink.swift index 9b6d742601..e12341be69 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.LocalLink.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.LocalLink.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Migrate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Migrate.swift index f76ac49579..55348259f5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Migrate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Migrate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.MigrateCancel.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.MigrateCancel.swift index 71a44976e9..2f428ca4f8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.MigrateCancel.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.MigrateCancel.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Move.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Move.swift index 153aed94f3..f44e31eb89 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Move.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Move.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.NetworkMode.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.NetworkMode.swift index c430291916..a678cce8be 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.NetworkMode.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.NetworkMode.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Recover.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Recover.swift index 8d030f45f9..41f0a4b485 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Recover.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Recover.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RecoverFromLegacyExport.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RecoverFromLegacyExport.swift index 905e020c43..3bf93a2371 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RecoverFromLegacyExport.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RecoverFromLegacyExport.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RevertDeletion.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RevertDeletion.swift index f7b64fdd12..0a03f47cb6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RevertDeletion.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.RevertDeletion.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Select.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Select.swift index 4808f2c220..7e7e7cf470 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Select.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Select.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Stop.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Stop.swift index aedb942e5f..7757d86836 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Stop.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.Stop.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.swift index ee5aca0d27..efc5cde47f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Account.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.GetVersion.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.GetVersion.swift index efc51fa1e4..b1547b45b1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.GetVersion.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.GetVersion.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.SetDeviceState.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.SetDeviceState.swift index 42dcadcfb3..4d6edf7497 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.SetDeviceState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.SetDeviceState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.Shutdown.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.Shutdown.swift index c6b272a54d..b4cc5fcbba 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.Shutdown.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.Shutdown.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.swift index c774366284..11de297382 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.App.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Copy.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Copy.swift index 1a697bb5fa..a932ebd594 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Copy.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Copy.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Create.swift index ee942c1d47..9823052785 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.CreateWidget.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.CreateWidget.swift index 9a65864bb2..b1a69234df 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.CreateWidget.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.CreateWidget.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Cut.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Cut.swift index 0d407eed38..e3b4ca59fd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Cut.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Cut.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Download.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Download.swift index f20eed3a2a..59b5d58f49 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Download.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Download.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Export.swift index a34917caf9..405359d025 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListConvertToObjects.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListConvertToObjects.swift index b86621f916..3ed754418a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListConvertToObjects.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListConvertToObjects.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDelete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDelete.swift index c5336ee722..38ed54f791 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDelete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDelete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDuplicate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDuplicate.swift index b0102e20d2..0a32d38d8a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDuplicate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListDuplicate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToExistingObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToExistingObject.swift index 1af516badc..ee0d3121c5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToExistingObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToExistingObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToNewObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToNewObject.swift index 30a5aa2439..49e984a5b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToNewObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListMoveToNewObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetAlign.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetAlign.swift index da4efe2981..ac53933dbf 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetAlign.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetAlign.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetBackgroundColor.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetBackgroundColor.swift index 38e4a24f9a..1a0de7e268 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetBackgroundColor.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetBackgroundColor.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetFields.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetFields.swift index 23c69f224f..af43202f37 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetFields.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetFields.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetVerticalAlign.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetVerticalAlign.swift index 9a905cf9dd..789166c177 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetVerticalAlign.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListSetVerticalAlign.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListTurnInto.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListTurnInto.swift index 448038d68b..af80d49012 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListTurnInto.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListTurnInto.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListUpdate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListUpdate.swift index dbafa89d87..bf83a00dfd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListUpdate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.ListUpdate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Merge.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Merge.swift index 0738bc62cc..0d6c1af08f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Merge.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Merge.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Paste.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Paste.swift index 88f1f5c57e..6ff19ef638 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Paste.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Paste.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Preview.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Preview.swift index c885999b3b..860072adc0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Preview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Preview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Replace.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Replace.swift index 68a4616661..7b1e1236ff 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Replace.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Replace.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetCarriage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetCarriage.swift index ecaca05ed8..a6f8fc6b8f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetCarriage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetCarriage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetFields.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetFields.swift index 29ba07bdde..373ae59179 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetFields.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.SetFields.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Split.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Split.swift index 5232416ab1..d77d8a299d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Split.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Split.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Upload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Upload.swift index 21cbbc9fa0..16c35cdf94 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Upload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.Upload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.swift index 205c449995..1f2e713539 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Block.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.CreateAndFetch.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.CreateAndFetch.swift index bc28f22d0c..631332a86f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.CreateAndFetch.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.CreateAndFetch.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.Fetch.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.Fetch.swift index 51abc5a605..2c7432cc24 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.Fetch.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.Fetch.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.swift index c77cad129d..779ad71507 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockBookmark.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.CreateFromExistingObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.CreateFromExistingObject.swift index 40a74a4eaf..b72df6552c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.CreateFromExistingObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.CreateFromExistingObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Filter.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Filter.swift index 2cabc7e246..95a25c2da4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Filter.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Filter.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.GroupOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.GroupOrder.swift index f8bf7b6a16..e773d61ab2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.GroupOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.GroupOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ObjectOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ObjectOrder.swift index 74b4af49bd..069faeb677 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ObjectOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ObjectOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Relation.swift index b219ca5eb1..c5212b77f7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.SetSource.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.SetSource.swift index 1fb633f492..3d49b1ca8e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.SetSource.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.SetSource.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Sort.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Sort.swift index 26a2d1a1a5..31f252910b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Sort.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.Sort.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.View.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.View.swift index 42051572f4..3fcc634df2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.View.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.View.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ViewRelation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ViewRelation.swift index b5b452e9a6..08aff53663 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ViewRelation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.ViewRelation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.swift index 44145e697a..e458276d65 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDataview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.ListSetStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.ListSetStyle.swift index 5133958cd7..513b5e202d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.ListSetStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.ListSetStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.swift index 7ff2a94162..3fe7c5347e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockDiv.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.CreateAndUpload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.CreateAndUpload.swift index 3ca968ec3d..6845f61ee6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.CreateAndUpload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.CreateAndUpload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.ListSetStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.ListSetStyle.swift index 34da600ab7..08f69d4447 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.ListSetStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.ListSetStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetName.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetName.swift index 7f51c001ad..a214a5229e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetName.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetName.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetTargetObjectId.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetTargetObjectId.swift index d5cb90d00d..8dd3ca9749 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetTargetObjectId.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.SetTargetObjectId.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.swift index fdbe6b60c8..90ce8d24e5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockFile.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetName.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetName.swift index c404944c63..ae0c83b133 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetName.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetName.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetWidth.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetWidth.swift index 0d5a9e8b30..92a7cd640b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetWidth.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.SetWidth.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.swift index 183bb2b92d..3039bc583d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockImage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetProcessor.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetProcessor.swift index 0c4531e868..47c87f50b5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetProcessor.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetProcessor.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetText.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetText.swift index 0db737f91d..c441dadd3b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetText.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.SetText.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.swift index c99201e490..9ffd38219c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLatex.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.CreateWithObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.CreateWithObject.swift index a2bf1c3265..7c0d7584c1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.CreateWithObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.CreateWithObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.ListSetAppearance.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.ListSetAppearance.swift index 25a74aa0da..c7c7bb4394 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.ListSetAppearance.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.ListSetAppearance.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.swift index 8fef7f112f..deee16ddfe 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockLink.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.Add.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.Add.swift index aab0539ebd..743291c885 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.Add.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.Add.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.SetKey.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.SetKey.swift index d5055c0d88..22e635ef12 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.SetKey.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.SetKey.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.swift index e40bf676d5..522e9ec3e6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockRelation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnCreate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnCreate.swift index 51e91631bd..71c4c757be 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnCreate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnCreate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDelete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDelete.swift index cd7461bf68..62dedd5440 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDelete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDelete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDuplicate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDuplicate.swift index e246d1f5dd..7670f857cf 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDuplicate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnDuplicate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnListFill.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnListFill.swift index b25c2b57f9..ae8060023e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnListFill.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnListFill.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnMove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnMove.swift index e4d5bbd7b5..2fa1ed933b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnMove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.ColumnMove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Create.swift index f2d563ff22..c42d6ca653 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Expand.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Expand.swift index a8f6101427..07a2ff726e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Expand.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Expand.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowCreate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowCreate.swift index 63467b1e53..02493414b1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowCreate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowCreate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDelete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDelete.swift index 18e19c999a..09601dbe11 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDelete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDelete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDuplicate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDuplicate.swift index 397bcb31a9..b556f159c1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDuplicate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowDuplicate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListClean.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListClean.swift index 839b27c4a3..04a9e263f9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListClean.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListClean.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListFill.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListFill.swift index a3d9268571..37297a71c0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListFill.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowListFill.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowSetHeader.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowSetHeader.swift index 50217f2cd8..767953634f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowSetHeader.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.RowSetHeader.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Sort.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Sort.swift index f0302f50e7..6c1108ec1b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Sort.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.Sort.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.swift index 13c9d53671..adbba7ff3f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockTable.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearContent.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearContent.swift index f146801715..634817849e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearContent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearContent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearStyle.swift index 08be36c610..2ea7c38167 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListClearStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetColor.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetColor.swift index c2b70fb1e9..ef974fd4f6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetColor.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetColor.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetMark.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetMark.swift index 1c47756f45..b9261bca22 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetMark.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetMark.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetStyle.swift index 382a500eb3..49c81d7ab0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.ListSetStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetChecked.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetChecked.swift index ebc1b12722..e291dba57c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetChecked.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetChecked.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetColor.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetColor.swift index 659cfea505..522790e9dc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetColor.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetColor.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetIcon.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetIcon.swift index cd888988d9..e7ba668f2c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetIcon.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetIcon.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetMarks.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetMarks.swift index 3d9c00ce7e..e70b66e304 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetMarks.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetMarks.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetStyle.swift index c40b5689ad..fc7fec8b5c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetText.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetText.swift index b428bf5fb1..5ac7635495 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetText.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.SetText.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.swift index 9c8525c59e..2b9146355b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockText.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetName.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetName.swift index e01f76c167..7fc29841e5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetName.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetName.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetWidth.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetWidth.swift index 154687de56..37298d7a1c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetWidth.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.SetWidth.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.swift index 56d99d6335..a67fb88d03 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockVideo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLayout.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLayout.swift index c333d1d66c..69a736bffb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLayout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLayout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLimit.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLimit.swift index b3d9c0b785..869c0a863e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLimit.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetLimit.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetTargetId.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetTargetId.swift index 027ed464ef..93b18ca374 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetTargetId.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetTargetId.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetViewId.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetViewId.swift index 0206b77c31..f7aef3288c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetViewId.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.SetViewId.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.swift index 913c47672e..69fb715aa2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.BlockWidget.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.PayloadEvent.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.PayloadEvent.swift index c5ede8d05f..2d2bd17e16 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.PayloadEvent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.PayloadEvent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.swift index 30ded353c0..827b364d2c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Broadcast.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.AddMessage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.AddMessage.swift index e89ca52961..9d824bf008 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.AddMessage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.AddMessage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.DeleteMessage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.DeleteMessage.swift index 2975ba2f9f..fe57423ba9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.DeleteMessage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.DeleteMessage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.EditMessageContent.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.EditMessageContent.swift index 7be47e5681..271305d05e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.EditMessageContent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.EditMessageContent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessages.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessages.swift index 64bc0a5d25..d365d22d7a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessages.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessages.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessagesByIds.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessagesByIds.swift index 176d62e012..436cde9d4f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessagesByIds.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.GetMessagesByIds.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadAll.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadAll.swift index 64511cbe9e..e8e706b6a2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadAll.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadAll.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadMessages.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadMessages.swift index 0b81ede692..c50074c9a1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadMessages.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ReadMessages.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeLastMessages.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeLastMessages.swift index fdf38108f3..62f06b940a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeLastMessages.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeLastMessages.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeToMessagePreviews.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeToMessagePreviews.swift index 3e79cdf4ad..92d44786e2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeToMessagePreviews.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.SubscribeToMessagePreviews.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ToggleMessageReaction.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ToggleMessageReaction.swift index a95c16790b..449e959624 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ToggleMessageReaction.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.ToggleMessageReaction.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unread.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unread.swift index fd04e44e5e..f0943f8b84 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unread.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unread.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unsubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unsubscribe.swift index b09ade1f2a..b041cabb13 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unsubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.Unsubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.UnsubscribeFromMessagePreviews.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.UnsubscribeFromMessagePreviews.swift index 3cc9661dd7..68434d4324 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.UnsubscribeFromMessagePreviews.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.UnsubscribeFromMessagePreviews.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.swift index 5376cf9a95..9f92abcd81 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Chat.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AccountSelectTrace.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AccountSelectTrace.swift index bc94c565c9..551995e3eb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AccountSelectTrace.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AccountSelectTrace.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AnystoreObjectChanges.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AnystoreObjectChanges.swift index 7e3b2f3421..0806e9b1ac 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AnystoreObjectChanges.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.AnystoreObjectChanges.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLocalstore.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLocalstore.swift index 1b125c0091..79577903f2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLocalstore.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLocalstore.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLog.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLog.swift index c56ff8227f..f627a3358f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLog.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.ExportLog.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.NetCheck.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.NetCheck.swift index 657fe3f49d..db16d356f3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.NetCheck.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.NetCheck.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.OpenedObjects.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.OpenedObjects.swift index efc9a8364c..c18af4a269 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.OpenedObjects.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.OpenedObjects.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Ping.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Ping.swift index 794feaae20..bb1b0c1821 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Ping.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Ping.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.RunProfiler.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.RunProfiler.swift index 47800ef19a..107a85c843 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.RunProfiler.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.RunProfiler.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.SpaceSummary.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.SpaceSummary.swift index a458859e90..48c14f1b45 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.SpaceSummary.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.SpaceSummary.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.StackGoroutines.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.StackGoroutines.swift index a9ddd0360a..21fb95fa99 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.StackGoroutines.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.StackGoroutines.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Stat.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Stat.swift index 5cb6bb8cde..499ffad813 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Stat.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Stat.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Subscriptions.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Subscriptions.swift index fc1d615222..7a4d4c56b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Subscriptions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Subscriptions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Tree.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Tree.swift index 72b91e6766..555a136190 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Tree.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.Tree.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeHeads.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeHeads.swift index 055681f926..98f986b5cc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeHeads.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeHeads.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeInfo.swift index 122edde5ac..0aca66de90 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.TreeInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.swift index 139ca5031d..4b670f711a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Debug.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.List.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.List.swift index 5b4515f987..765c04184e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.List.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.List.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.NetworkState.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.NetworkState.swift index 4a297295a5..e54b53f6af 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.NetworkState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.NetworkState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.SetName.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.SetName.swift index 5324eb7d91..ad60b03620 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.SetName.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.SetName.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.swift index 8944cbe26f..465aacbc68 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Device.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.DiscardPreload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.DiscardPreload.swift index 35499ad8a1..9ba7ae05a6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.DiscardPreload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.DiscardPreload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Download.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Download.swift index 4fbf420b6b..7515a4fafd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Download.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Download.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Drop.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Drop.swift index a7c1cb7fa3..100c94fd67 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Drop.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Drop.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.ListOffload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.ListOffload.swift index 9a64893fba..4c2b04c951 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.ListOffload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.ListOffload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.NodeUsage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.NodeUsage.swift index 5931f71270..e14d614e42 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.NodeUsage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.NodeUsage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Offload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Offload.swift index 97be2ad0e6..8e18cb1210 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Offload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Offload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Reconcile.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Reconcile.swift index 7f6e7500cc..9cc0b99a4c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Reconcile.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Reconcile.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SetAutoDownload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SetAutoDownload.swift index 2b3a6b9c48..524f7c7224 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SetAutoDownload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SetAutoDownload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceOffload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceOffload.swift index d4145c6a08..171731b428 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceOffload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceOffload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceUsage.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceUsage.swift index 887ead2df7..fa27e121ab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceUsage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.SpaceUsage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Upload.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Upload.swift index f1246a962e..7b44aecaf8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Upload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.Upload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.swift index de77fb6afa..b9e910a816 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.File.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadIndex.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadIndex.swift index 9e2c7757ef..f4266e0d34 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadIndex.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadIndex.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadManifest.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadManifest.swift index a93701a38d..6cc6cddf32 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadManifest.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.DownloadManifest.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.swift index db7d19b4ec..591aaaf6b7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Gallery.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.Error.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.Error.swift index 432060e1c6..10e94a9809 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.Error.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.Error.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.swift index 625230949e..f3a5e644ab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.GenericErrorResponse.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.DiffVersions.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.DiffVersions.swift index 56219a90fe..5a922fb9b0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.DiffVersions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.DiffVersions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.GetVersions.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.GetVersions.swift index 1dcafd4b0d..da8f7097dc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.GetVersions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.GetVersions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.SetVersion.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.SetVersion.swift index be3feeea88..1b91751f52 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.SetVersion.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.SetVersion.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.ShowVersion.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.ShowVersion.swift index 009e4c553c..7328f5a863 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.ShowVersion.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.ShowVersion.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.Version.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.Version.swift index 36c6f561a0..64df80d5fc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.Version.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.Version.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.swift index 3119bed017..cc48176ad6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.History.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.SetParameters.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.SetParameters.swift index a329c632ef..5d0819a3c5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.SetParameters.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.SetParameters.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.swift index d398dcc5b5..0850c6d7cd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Initial.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Request.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Request.swift index d623160aaa..ec17cbd9ce 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Request.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Request.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Response.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Response.swift index ab6ed2a5e6..97847d2410 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Response.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.Response.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.swift index da21b053a8..e92de5ba9e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.LinkPreview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.Send.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.Send.swift index f08bba95b2..5b7f3a80cf 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.Send.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.Send.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.swift index 6ec412e2ed..bc1fbd541b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Log.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeGetInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeGetInfo.swift index d0b21f73ac..c3f03dca2e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeGetInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeGetInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeRedeem.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeRedeem.swift index b66af764f2..25732e68e1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeRedeem.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.CodeRedeem.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.Finalize.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.Finalize.swift index 242bc020d2..88c8e0715d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.Finalize.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.Finalize.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetPortalLinkUrl.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetPortalLinkUrl.swift index 276b8ed951..898da6837f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetPortalLinkUrl.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetPortalLinkUrl.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetStatus.swift index 8fee2323f6..66c9e89796 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetTiers.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetTiers.swift index da9bda3210..c519082249 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetTiers.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetTiers.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmail.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmail.swift index 0f7bdcc608..e6fa646eba 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmail.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmail.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmailStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmailStatus.swift index b3696c8a04..b43f5dc485 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmailStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.GetVerificationEmailStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.IsNameValid.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.IsNameValid.swift index 57a8d4e2ec..8a244caa69 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.IsNameValid.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.IsNameValid.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.RegisterPaymentRequest.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.RegisterPaymentRequest.swift index d141ce1d82..fa7feb5f7b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.RegisterPaymentRequest.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.RegisterPaymentRequest.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyAppStoreReceipt.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyAppStoreReceipt.swift index 5d1d80f3fe..118fd6ef6e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyAppStoreReceipt.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyAppStoreReceipt.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyEmailCode.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyEmailCode.swift index 1994f51172..d4d9a8f8b8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyEmailCode.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.VerifyEmailCode.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.swift index 98a8375d5b..72c20e6b8b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Membership.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveAnyId.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveAnyId.swift index 07196dbe84..f5659d6da9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveAnyId.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveAnyId.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveName.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveName.swift index 4c27a8b54f..3a8272bedb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveName.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveName.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveSpaceId.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveSpaceId.swift index d47e1f8765..ca6b282c79 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveSpaceId.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.ResolveSpaceId.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.UserAccount.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.UserAccount.swift index 7e7e74dc80..2ac0753074 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.UserAccount.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.UserAccount.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.swift index a5ac1b4e56..533a6cc8b5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.NameService.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.Context.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.Context.swift index 9e741d4ac3..69064d6797 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.Context.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.Context.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.GetObjectInfoWithLinks.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.GetObjectInfoWithLinks.swift index 2d493efbbb..288afd17e0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.GetObjectInfoWithLinks.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.GetObjectInfoWithLinks.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.ListObjects.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.ListObjects.swift index a798168e03..9d1a5c5694 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.ListObjects.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.ListObjects.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.swift index 2f63c2c875..6ac00ab403 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Navigation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.List.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.List.swift index 4180b8559d..f3fafd175d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.List.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.List.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Reply.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Reply.swift index 65aa79cc47..10e830d27b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Reply.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Reply.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Test.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Test.swift index f092d361db..db73a0750b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Test.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.Test.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.swift index 26631bc379..df0d0b6395 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Notification.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ApplyTemplate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ApplyTemplate.swift index 77404d81d1..7ed910a5c9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ApplyTemplate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ApplyTemplate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.BookmarkFetch.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.BookmarkFetch.swift index fbda6c7b24..825ced8438 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.BookmarkFetch.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.BookmarkFetch.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ChatAdd.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ChatAdd.swift index a2d81f3472..27c8a04b99 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ChatAdd.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ChatAdd.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Close.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Close.swift index ca501f91f2..f55525d328 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Close.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Close.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Create.swift index be379b995a..ce33cfd1f2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateBookmark.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateBookmark.swift index 072014003e..178a8949b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateBookmark.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateBookmark.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateFromUrl.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateFromUrl.swift index a84f27725d..a7b7800c2a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateFromUrl.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateFromUrl.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateObjectType.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateObjectType.swift index 5ddf45221f..cb0172eab1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateObjectType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateObjectType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelation.swift index a8f333e0a0..f7a53e9d18 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelationOption.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelationOption.swift index ecbf1f62e8..9e7a29a126 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelationOption.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateRelationOption.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateSet.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateSet.swift index 2bee1bced9..93698819fb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateSet.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CreateSet.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchSubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchSubscribe.swift index 77edfae14c..bb455e5a85 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchSubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchSubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchUnsubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchUnsubscribe.swift index 013398102a..548ba31ad6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchUnsubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.CrossSpaceSearchUnsubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.DateByTimestamp.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.DateByTimestamp.swift index acd0eb2dda..7c213f8711 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.DateByTimestamp.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.DateByTimestamp.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Duplicate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Duplicate.swift index 2e23d871ed..c229bdb991 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Duplicate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Duplicate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Export.swift index caf61e65af..be0192c020 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Graph.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Graph.swift index 0dfb87708d..179cc5a802 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Graph.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Graph.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.GroupsSubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.GroupsSubscribe.swift index b7adedf40e..f147abb30e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.GroupsSubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.GroupsSubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Import.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Import.swift index 388502a42e..3e493d5399 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Import.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Import.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportExperience.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportExperience.swift index e7f292d0a1..69b53ba9c9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportExperience.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportExperience.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportList.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportList.swift index 43f394a59f..a0812f9f9f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportList.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportList.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportUseCase.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportUseCase.swift index 2ab0650af4..e767b397f3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportUseCase.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ImportUseCase.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDelete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDelete.swift index 9d1f9c46ea..d444cc5d36 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDelete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDelete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDuplicate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDuplicate.swift index f298ed0ef7..9540b2f7ca 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDuplicate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListDuplicate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListExport.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListExport.swift index d74dd55202..abc78212b1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListExport.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListExport.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListModifyDetailValues.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListModifyDetailValues.swift index 677ab548c8..67a2816944 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListModifyDetailValues.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListModifyDetailValues.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetDetails.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetDetails.swift index 7950952288..190ab01b35 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetDetails.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetDetails.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsArchived.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsArchived.swift index 7b426dc94a..e8c4761180 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsArchived.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsArchived.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsFavorite.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsFavorite.swift index 63724386e4..be15c5df93 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsFavorite.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetIsFavorite.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetObjectType.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetObjectType.swift index 0cb0db2653..64553bc196 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetObjectType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ListSetObjectType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Open.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Open.swift index a43b4b382e..a39aee8bee 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Open.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Open.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.OpenBreadcrumbs.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.OpenBreadcrumbs.swift index f32864b6b4..0c77a25c1a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.OpenBreadcrumbs.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.OpenBreadcrumbs.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Redo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Redo.swift index 28a57ec7db..9f6101326e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Redo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Redo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Refresh.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Refresh.swift index 710758fc07..199171eb49 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Refresh.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Refresh.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Search.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Search.swift index 77f92713ff..4741d08a4e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Search.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Search.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchSubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchSubscribe.swift index 9de18cc84c..2671c2ae02 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchSubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchSubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchUnsubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchUnsubscribe.swift index 3343b7b004..3c5cd4fce9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchUnsubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchUnsubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchWithMeta.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchWithMeta.swift index 7f5c1b3598..957ff64e8f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchWithMeta.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SearchWithMeta.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetBreadcrumbs.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetBreadcrumbs.swift index 050a630e73..42dd072b9b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetBreadcrumbs.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetBreadcrumbs.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetDetails.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetDetails.swift index 8ec2538415..38f5e0da58 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetDetails.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetDetails.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetInternalFlags.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetInternalFlags.swift index bab83b17c2..2a7b543084 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetInternalFlags.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetInternalFlags.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsArchived.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsArchived.swift index 6bd74f0489..af016b2bef 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsArchived.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsArchived.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsFavorite.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsFavorite.swift index 3c9b02fc79..763ec9ced2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsFavorite.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetIsFavorite.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetLayout.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetLayout.swift index c3eb69ac3a..1b0f05b4f7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetLayout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetLayout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetObjectType.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetObjectType.swift index bc028a5639..b9c7b8e19a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetObjectType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetObjectType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetSource.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetSource.swift index 4e999c3ba8..414a960946 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetSource.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SetSource.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ShareByLink.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ShareByLink.swift index 148e6ccecd..16e82e55d9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ShareByLink.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ShareByLink.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Show.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Show.swift index 06f37579f3..e34d01df40 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Show.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Show.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SubscribeIds.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SubscribeIds.swift index a4856ecba8..514047b4e6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SubscribeIds.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.SubscribeIds.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToCollection.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToCollection.swift index c8cef6e5a9..11ec8f7004 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToCollection.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToCollection.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToSet.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToSet.swift index 462f40391d..b23aaf9063 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToSet.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.ToSet.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Undo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Undo.swift index 1d105e6c19..4058569362 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Undo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.Undo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.UndoRedoCounter.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.UndoRedoCounter.swift index e542c075fa..2527ca3796 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.UndoRedoCounter.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.UndoRedoCounter.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.WorkspaceSetDashboard.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.WorkspaceSetDashboard.swift index cba117334e..4f4495952e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.WorkspaceSetDashboard.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.WorkspaceSetDashboard.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.swift index e8b875946d..849d9046ea 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Object.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Add.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Add.swift index 261ebf6a0c..4b8f9d5aa8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Add.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Add.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Remove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Remove.swift index eb89108b49..5050f69fa8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Remove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Remove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Sort.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Sort.swift index aa07b2757a..48b63f94ac 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Sort.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.Sort.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.swift index 42fbc397ec..d97bd951a8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectCollection.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Add.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Add.swift index 635e8837a6..a701dad64d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Add.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Add.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.AddFeatured.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.AddFeatured.swift index 00a314bfbd..8b5495a987 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.AddFeatured.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.AddFeatured.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Delete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Delete.swift index 3ba8d32b94..cf2500978d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Delete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.Delete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.ListAvailable.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.ListAvailable.swift index 6f7db654b8..8ba63d512d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.ListAvailable.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.ListAvailable.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.RemoveFeatured.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.RemoveFeatured.swift index d0273c63be..aceecce26e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.RemoveFeatured.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.RemoveFeatured.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.swift index 9f034bd27c..34938fd504 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectRelation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ListConflictingRelations.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ListConflictingRelations.swift index 8339b93db4..48dba4f93a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ListConflictingRelations.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ListConflictingRelations.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Recommended.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Recommended.swift index 5207b72248..2882a0de71 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Recommended.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Recommended.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Relation.swift index 923c573d54..29501c9d56 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ResolveLayoutConflicts.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ResolveLayoutConflicts.swift index 0dc0dbca92..34dfdd5a20 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ResolveLayoutConflicts.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.ResolveLayoutConflicts.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.SetOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.SetOrder.swift index f762b528a9..3619a02a2f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.SetOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.SetOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.swift index 08f0921b95..d269fed6c1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.ObjectType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Cancel.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Cancel.swift index a0c82c3cb8..bc1b6cc496 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Cancel.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Cancel.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Subscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Subscribe.swift index 331f8c330f..122b38519c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Subscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Subscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Unsubscribe.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Unsubscribe.swift index 2682b2de50..d69cb0c217 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Unsubscribe.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.Unsubscribe.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.swift index 7d9308bff0..0f363aeeb5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Process.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Create.swift index 64698ebd12..8ee1bcdb95 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.GetStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.GetStatus.swift index 4a1898b1f4..d7c0a45fd8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.GetStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.GetStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.List.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.List.swift index 756be33005..92a6ce2405 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.List.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.List.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishState.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishState.swift index d534fce257..48682c5aa8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishStatus.swift index 30dab29d65..8364a29aeb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.PublishStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Remove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Remove.swift index d7490fcf2e..7d8d2ee609 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Remove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.Remove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.ResolveUri.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.ResolveUri.swift index c09dbcc5f2..bfc6fc6904 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.ResolveUri.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.ResolveUri.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.swift index 63dc261f6c..ea3dc714c8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Publishing.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.Mode.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.Mode.swift index 02c323ec19..49908c575b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.Mode.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.Mode.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.RegisterToken.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.RegisterToken.swift index 8fa287694e..15c81c62dd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.RegisterToken.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.RegisterToken.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.ResetIds.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.ResetIds.swift index 93ad5a9a28..b6f815b823 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.ResetIds.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.ResetIds.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetForceModeIds.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetForceModeIds.swift index 9eb12e39a2..5dcea87cbc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetForceModeIds.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetForceModeIds.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetSpaceMode.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetSpaceMode.swift index ecaa946947..d470cc9331 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetSpaceMode.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.SetSpaceMode.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.swift index 9a1c5c6342..942d67a37a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.PushNotification.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListRemoveOption.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListRemoveOption.swift index 01e299bec7..561f60d3a1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListRemoveOption.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListRemoveOption.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListWithValue.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListWithValue.swift index 2f00389efd..2911d0f5be 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListWithValue.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.ListWithValue.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Option.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Option.swift index 733a3c76e2..e4fea5486a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Option.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Option.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Options.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Options.swift index 206e62c4e9..cee5aefbab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Options.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.Options.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.swift index 7c1f39c0cb..21093e4b2c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Delete.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Delete.swift index 3eaee36fd6..9f9fc4f7e6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Delete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Delete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteChange.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteChange.swift index ec7cad1600..da7344813e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteChange.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteChange.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGenerate.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGenerate.swift index f754f78a8a..91a31e4a24 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGenerate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGenerate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetCurrent.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetCurrent.swift index 2a60a559b5..662020ce81 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetCurrent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetCurrent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetGuest.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetGuest.swift index 9279a6acea..0adadada2f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetGuest.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteGetGuest.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteRevoke.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteRevoke.swift index ff3956c386..abfd1113cd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteRevoke.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteRevoke.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteView.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteView.swift index 23184f85ba..a0f5c25cde 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteView.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.InviteView.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ @@ -55,6 +55,12 @@ extension Anytype_Rpc.Space { public var creatorName: String = String() + public var creatorIconCid: String = String() + + public var spaceIconOption: UInt32 = 0 + + public var spaceUxType: UInt32 = 0 + /// deprecated, use inviteType public var isGuestUserInvite: Bool = false @@ -191,7 +197,7 @@ extension Anytype_Rpc.Space.InviteView.Request: SwiftProtobuf.Message, SwiftProt extension Anytype_Rpc.Space.InviteView.Response: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { public static let protoMessageName: String = Anytype_Rpc.Space.InviteView.protoMessageName + ".Response" - public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}error\0\u{1}spaceId\0\u{1}spaceName\0\u{1}spaceIconCid\0\u{1}creatorName\0\u{1}isGuestUserInvite\0\u{1}inviteType\0") + public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}error\0\u{1}spaceId\0\u{1}spaceName\0\u{1}spaceIconCid\0\u{1}creatorName\0\u{1}isGuestUserInvite\0\u{1}inviteType\0\u{1}spaceIconOption\0\u{1}spaceUxType\0\u{1}creatorIconCid\0") public mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { @@ -206,6 +212,9 @@ extension Anytype_Rpc.Space.InviteView.Response: SwiftProtobuf.Message, SwiftPro case 5: try { try decoder.decodeSingularStringField(value: &self.creatorName) }() case 6: try { try decoder.decodeSingularBoolField(value: &self.isGuestUserInvite) }() case 7: try { try decoder.decodeSingularEnumField(value: &self.inviteType) }() + case 8: try { try decoder.decodeSingularUInt32Field(value: &self.spaceIconOption) }() + case 9: try { try decoder.decodeSingularUInt32Field(value: &self.spaceUxType) }() + case 10: try { try decoder.decodeSingularStringField(value: &self.creatorIconCid) }() default: break } } @@ -237,6 +246,15 @@ extension Anytype_Rpc.Space.InviteView.Response: SwiftProtobuf.Message, SwiftPro if self.inviteType != .member { try visitor.visitSingularEnumField(value: self.inviteType, fieldNumber: 7) } + if self.spaceIconOption != 0 { + try visitor.visitSingularUInt32Field(value: self.spaceIconOption, fieldNumber: 8) + } + if self.spaceUxType != 0 { + try visitor.visitSingularUInt32Field(value: self.spaceUxType, fieldNumber: 9) + } + if !self.creatorIconCid.isEmpty { + try visitor.visitSingularStringField(value: self.creatorIconCid, fieldNumber: 10) + } try unknownFields.traverse(visitor: &visitor) } @@ -246,6 +264,9 @@ extension Anytype_Rpc.Space.InviteView.Response: SwiftProtobuf.Message, SwiftPro if lhs.spaceName != rhs.spaceName {return false} if lhs.spaceIconCid != rhs.spaceIconCid {return false} if lhs.creatorName != rhs.creatorName {return false} + if lhs.creatorIconCid != rhs.creatorIconCid {return false} + if lhs.spaceIconOption != rhs.spaceIconOption {return false} + if lhs.spaceUxType != rhs.spaceUxType {return false} if lhs.isGuestUserInvite != rhs.isGuestUserInvite {return false} if lhs.inviteType != rhs.inviteType {return false} if lhs.unknownFields != rhs.unknownFields {return false} diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Join.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Join.swift index f9591b3665..e1dc65950b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Join.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.Join.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.JoinCancel.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.JoinCancel.swift index c46171838d..ab4a080ed5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.JoinCancel.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.JoinCancel.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.LeaveApprove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.LeaveApprove.swift index 1c9a8e7b1a..87f8271588 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.LeaveApprove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.LeaveApprove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.MakeShareable.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.MakeShareable.swift index 0742ef7006..605ef85d02 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.MakeShareable.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.MakeShareable.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantPermissionsChange.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantPermissionsChange.swift index deaf6345af..67440751bb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantPermissionsChange.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantPermissionsChange.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantRemove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantRemove.swift index 133caaa0d2..42a4a48775 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantRemove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.ParticipantRemove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestApprove.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestApprove.swift index cdd55007cc..273d456e23 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestApprove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestApprove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestDecline.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestDecline.swift index 986af65f09..19a5d20014 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestDecline.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.RequestDecline.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.SetOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.SetOrder.swift index 451134da05..4807051e82 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.SetOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.SetOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.StopSharing.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.StopSharing.swift index d764e63c32..3501326320 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.StopSharing.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.StopSharing.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.UnsetOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.UnsetOrder.swift index 7109369382..0183b33edc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.UnsetOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.UnsetOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.swift index 0a71b8d88f..6e38b8886a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Space.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.Clone.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.Clone.swift index a68ea4cb3c..8f4e32c574 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.Clone.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.Clone.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.CreateFromObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.CreateFromObject.swift index cdac6d1b46..89baf2aab8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.CreateFromObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.CreateFromObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.ExportAll.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.ExportAll.swift index f7ac1132d3..8a570274c5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.ExportAll.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.ExportAll.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.swift index aaf8ab5d18..9a0ae9c9e1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Template.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Download.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Download.swift index b3daf5d44c..bff853062e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Download.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Download.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Search.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Search.swift index 3690c9310c..2cee97e8a8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Search.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.Search.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.swift index e206452c2e..ce9d2b2867 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Unsplash.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CloseSession.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CloseSession.swift index 589442b0ff..2d128d064d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CloseSession.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CloseSession.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Convert.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Convert.swift index 9b41b38a44..97feab875c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Convert.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Convert.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Create.swift index 20276258d8..b84e455420 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CreateSession.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CreateSession.swift index 649f106aa7..98fea091f8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CreateSession.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.CreateSession.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Recover.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Recover.swift index 62a8792181..99dcd57422 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Recover.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.Recover.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.swift index 875ec60ade..ea81379fd6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Wallet.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Create.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Create.swift index 05922f1a93..306d09064e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Create.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Create.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Export.swift index bb429d6704..2f982a4a1b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetAll.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetAll.swift index ae39c7fa23..ce92ce6080 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetAll.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetAll.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetCurrent.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetCurrent.swift index 53b603799c..f434758d49 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetCurrent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.GetCurrent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Object.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Object.swift index aa5cc95c1f..8f3dbacdcc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Object.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Object.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Open.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Open.swift index bafed4a4a6..e5b56738e0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Open.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Open.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Select.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Select.swift index 0987408231..9bccf5ed48 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Select.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.Select.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.SetInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.SetInfo.swift index f5b8bec84e..ddf7dc6730 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.SetInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.SetInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.swift index 2ec2b9ac0f..9eb94fe239 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.Workspace.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.swift index 34ebbeb5e0..3a7f42b32f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_Rpc.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_StreamRequest.swift b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_StreamRequest.swift index b875b2d5ae..79722d6860 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_StreamRequest.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Commands/Anytype_StreamRequest.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/commands.proto +// Source: commands.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Config.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Config.swift index b2202476b3..71918c8a94 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Config.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Config.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Details.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Details.swift index 1bbdb24ac8..80bdbf78fc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Details.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Details.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallenge.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallenge.swift index 9a6dbcfdd1..b07169fb62 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallenge.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallenge.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallengeHide.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallengeHide.swift index 46ad7f3338..5c0432f32d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallengeHide.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.LinkChallengeHide.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Show.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Show.swift index 80e758ee7a..7611917490 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Show.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Show.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Update.swift index 0606975357..6a1948af86 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.swift index 27d3c2a040..b9c5da125d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Account.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Add.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Add.swift index 02b7c69b60..e5b8f51903 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Add.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Add.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Dataview.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Dataview.swift index a4567d6d45..3b1d98486d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Dataview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Dataview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Delete.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Delete.swift index 1f53ebf8f7..0be4ecab37 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Delete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Delete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.FilesUpload.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.FilesUpload.swift index 5134f8ffc6..0a011ed206 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.FilesUpload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.FilesUpload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Fill.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Fill.swift index 20ffa8402b..367dd08f70 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Fill.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Fill.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.MarksInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.MarksInfo.swift index 2ace502b24..f80e691721 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.MarksInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.MarksInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Set.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Set.swift index ac1e6711da..f7b938f810 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Set.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.Set.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.swift index 94095c11c6..8af9248681 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Block.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Add.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Add.swift index 87936f9ab0..04c6571557 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Add.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Add.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Delete.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Delete.swift index 5db5647c01..8f2b9f5ec4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Delete.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Delete.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Update.swift index 2965d719af..f0873533e1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMentionReadStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMentionReadStatus.swift index 8b772d555f..b29bf67152 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMentionReadStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMentionReadStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageReadStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageReadStatus.swift index cc002b4836..8396cb9359 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageReadStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageReadStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageSyncStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageSyncStatus.swift index 9c6a15cd31..170d85cf8d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageSyncStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateMessageSyncStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateReactions.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateReactions.swift index 312d1f8c51..1c44ab6b34 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateReactions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateReactions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateState.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateState.swift index bebe1f489a..98d2d4de9d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.UpdateState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.swift index 3557530a98..338a67429e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Chat.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitReached.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitReached.swift index 75e9e6c567..42299a7b05 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitReached.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitReached.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitUpdated.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitUpdated.swift index de6d50837d..9caf6072bd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitUpdated.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LimitUpdated.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LocalUsage.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LocalUsage.swift index e671435535..b71d81c7fa 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LocalUsage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.LocalUsage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.SpaceUsage.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.SpaceUsage.swift index 17081048a2..d9b7f9b1b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.SpaceUsage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.SpaceUsage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.swift index c0b6b7dec7..0faa9c93d6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.File.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.Finish.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.Finish.swift index 64c46628f1..cb1057b155 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.Finish.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.Finish.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.swift index cd10d33d26..a8f7232ce4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Import.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.TiersUpdate.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.TiersUpdate.swift index ca319b2182..c38062ce3a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.TiersUpdate.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.TiersUpdate.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.Update.swift index 291789831e..9b9844a167 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.swift index bdfbeb35f1..be04d2ea83 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Membership.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.OneOf_Value.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.OneOf_Value.swift index b34b1af086..52b8093b66 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.OneOf_Value.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.OneOf_Value.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.swift index 4ed574c45b..9164c8be7f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Message.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Send.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Send.swift index cc354b2d34..c551f4fe6c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Send.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Send.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Update.swift index ab80c32d10..65ca1144e9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.swift index 8727d11bb4..531c8dccab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Notification.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Close.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Close.swift index 0b127209d1..0540fe85c5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Close.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Close.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Details.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Details.swift index ff7a05053e..0be2dd7ba4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Details.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Details.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Relations.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Relations.swift index c63d98074b..abbd9d2e63 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Relations.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Relations.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Remove.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Remove.swift index 91e3c16cf5..7025e38cc2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Remove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Remove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Restrictions.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Restrictions.swift index c24182fa81..d84e309829 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Restrictions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Restrictions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Subscription.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Subscription.swift index 76c3ada0d8..d34f78a4ab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Subscription.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.Subscription.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.swift index 2248c048d2..ae3be6e269 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Object.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Status.swift index 2771741d8a..0ea1e1fddc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Update.swift index abcc10af8b..fd0e5f50e0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.swift index aa2df79b88..76470f1f41 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.P2PStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.Broadcast.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.Broadcast.swift index bfeac953ab..d1d3c64b87 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.Broadcast.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.Broadcast.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.swift index 07b24b22bb..d502adda48 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Payload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Ping.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Ping.swift index 1e641087cc..1e85d86a67 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Ping.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Ping.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Done.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Done.swift index 518761ae0f..8b1dd40ee7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Done.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Done.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.New.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.New.swift index 2986c5c5d8..e2df56e646 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.New.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.New.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Update.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Update.swift index 3473a2d861..b47efb7346 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Update.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.Update.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.swift index b1912feb54..e0fe9d946b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Process.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Network.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Network.swift index 868d2eecb0..5fb6e97e13 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Network.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Network.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Status.swift index 453e05efa3..5f8a9c7747 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncError.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncError.swift index 37ea255161..56401fe315 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncError.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncError.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncStatus.swift index 35ee571dc9..cad8a143a5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.SyncStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ @@ -35,6 +35,8 @@ extension Anytype_Event.Space { public var notSyncedFilesCounter: Int64 = 0 + public var uploadingFilesCounter: Int64 = 0 + public var unknownFields = SwiftProtobuf.UnknownStorage() public init() {} @@ -65,7 +67,7 @@ extension Anytype_Event.Space.SyncStatus: SwiftProtobuf.Message, SwiftProtobuf._ extension Anytype_Event.Space.SyncStatus.Update: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { public static let protoMessageName: String = Anytype_Event.Space.SyncStatus.protoMessageName + ".Update" - public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}id\0\u{1}status\0\u{1}network\0\u{1}error\0\u{1}syncingObjectsCounter\0\u{1}notSyncedFilesCounter\0") + public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}id\0\u{1}status\0\u{1}network\0\u{1}error\0\u{1}syncingObjectsCounter\0\u{1}notSyncedFilesCounter\0\u{1}uploadingFilesCounter\0") public mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { @@ -79,6 +81,7 @@ extension Anytype_Event.Space.SyncStatus.Update: SwiftProtobuf.Message, SwiftPro case 4: try { try decoder.decodeSingularEnumField(value: &self.error) }() case 5: try { try decoder.decodeSingularInt64Field(value: &self.syncingObjectsCounter) }() case 6: try { try decoder.decodeSingularInt64Field(value: &self.notSyncedFilesCounter) }() + case 7: try { try decoder.decodeSingularInt64Field(value: &self.uploadingFilesCounter) }() default: break } } @@ -103,6 +106,9 @@ extension Anytype_Event.Space.SyncStatus.Update: SwiftProtobuf.Message, SwiftPro if self.notSyncedFilesCounter != 0 { try visitor.visitSingularInt64Field(value: self.notSyncedFilesCounter, fieldNumber: 6) } + if self.uploadingFilesCounter != 0 { + try visitor.visitSingularInt64Field(value: self.uploadingFilesCounter, fieldNumber: 7) + } try unknownFields.traverse(visitor: &visitor) } @@ -113,6 +119,7 @@ extension Anytype_Event.Space.SyncStatus.Update: SwiftProtobuf.Message, SwiftPro if lhs.error != rhs.error {return false} if lhs.syncingObjectsCounter != rhs.syncingObjectsCounter {return false} if lhs.notSyncedFilesCounter != rhs.notSyncedFilesCounter {return false} + if lhs.uploadingFilesCounter != rhs.uploadingFilesCounter {return false} if lhs.unknownFields != rhs.unknownFields {return false} return true } diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.swift index f37bc9acb9..ad6be5d370 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Space.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.Thread.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.Thread.swift index 7618882228..552e735c7d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.Thread.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.Thread.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.swift index 1d30baec7d..d6f9f07c5f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.Block.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.Block.swift index 6707cfa3b5..77e325a870 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.Block.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.Block.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.swift index f922e91215..08b683f83a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.User.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.swift index 115e591a35..0479f900bd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Event.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.DropFiles.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.DropFiles.swift index 99fee95892..da4e74f490 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.DropFiles.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.DropFiles.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Export.swift index 3eb9337c74..d5cc82207e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Import.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Import.swift index 2b11394102..25df18ad16 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Import.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Import.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Migration.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Migration.swift index a648be22f4..afb48af9a0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Migration.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Migration.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.OneOf_Message.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.OneOf_Message.swift index e0b7a05b35..bb49327225 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.OneOf_Message.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.OneOf_Message.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.PreloadFile.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.PreloadFile.swift index 494b147796..dc1fcca203 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.PreloadFile.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.PreloadFile.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Progress.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Progress.swift index 166edf684e..c17100e2d2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Progress.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.Progress.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.SaveFile.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.SaveFile.swift index e08a68b4f4..c1de1aa1e9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.SaveFile.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.SaveFile.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.State.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.State.swift index 5c0dd7e483..f1b628221a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.State.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.State.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.swift index 76ac343173..79d5e7aba4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.Process.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.swift index 4848cf53dd..800a060ac4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_Model.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_ResponseEvent.swift b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_ResponseEvent.swift index 0e2d391442..facee2b2a8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_ResponseEvent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Events/Anytype_ResponseEvent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pb/protos/events.proto +// Source: events.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.AppInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.AppInfo.swift index 47e28f57a8..a6bbdce234 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.AppInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.AppInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.LocalApiScope.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.LocalApiScope.swift index 52c8684d37..3c36bfb0a1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.LocalApiScope.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.LocalApiScope.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.swift index ed8caab8ba..39d73b8ea8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Auth.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Config.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Config.swift index 323be2d23f..d79b95a41e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Config.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Config.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Info.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Info.swift index aeeb134e6b..4787043515 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Info.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Info.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Status.swift index fdc78874f3..228020fc07 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.StatusType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.StatusType.swift index 106f7f38cf..61791eb4e7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.StatusType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.StatusType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.swift index 206967ff49..877358d63c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Account.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Align.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Align.swift index 8981b87d40..7e0b0fee27 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Align.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Align.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.State.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.State.swift index c70ee418da..2502da69e8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.State.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.State.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.swift index 4024ffa9e5..59800c1738 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Bookmark.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Chat.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Chat.swift index 85a3f1fd65..b792866bae 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Chat.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Chat.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Checkbox.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Checkbox.swift index 7ec9d07249..ab6f892b50 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Checkbox.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Checkbox.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Date.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Date.swift index aff5cb4dd7..63792e26c8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Date.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Date.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Filter.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Filter.swift index 1bba53c853..e1206988b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Filter.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Filter.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Group.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Group.swift index 8cbb9e726e..46a12e27be 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Group.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Group.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.GroupOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.GroupOrder.swift index 2ab7cb73ba..8331c789d7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.GroupOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.GroupOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ObjectOrder.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ObjectOrder.swift index ecfcf6461a..6f157c65a1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ObjectOrder.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ObjectOrder.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Relation.swift index 65b633a931..ba8f8cc042 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Sort.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Sort.swift index 411896d0b7..a6fc8191ab 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Sort.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Sort.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Status.swift index 947e2bf542..e686591896 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Tag.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Tag.swift index a404710c53..f198c0b1e5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Tag.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.Tag.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.View.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.View.swift index 89fccbb61a..bf6d7884cd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.View.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.View.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ViewGroup.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ViewGroup.swift index 50ce1a2754..f2dc738104 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ViewGroup.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.ViewGroup.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.swift index 92c960c9b9..bf880a283c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Dataview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.Style.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.Style.swift index f721bbe44d..5f601408a9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.Style.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.Style.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.swift index 143ffaf50f..3d6ae68ee9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Div.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.FeaturedRelations.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.FeaturedRelations.swift index 46b9a0ad4b..598d491d29 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.FeaturedRelations.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.FeaturedRelations.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.State.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.State.swift index 65b1b09406..7f7c01dd54 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.State.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.State.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.Style.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.Style.swift index e05aac3794..7c031a8d14 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.Style.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.Style.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.TypeEnum.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.TypeEnum.swift index d7f51248e7..44acc5794e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.TypeEnum.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.TypeEnum.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.swift index 236bbfb51f..9f670b4c06 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.File.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Icon.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Icon.swift index 29e823149b..d817e83934 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Icon.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Icon.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.Processor.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.Processor.swift index 11fc6a1c90..574199f79a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.Processor.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.Processor.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.swift index 4b6aacf57d..89e4336587 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Latex.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.Style.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.Style.swift index a1854f8276..552e329ca9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.Style.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.Style.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.swift index ac40e94200..85dc91f557 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Layout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.CardStyle.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.CardStyle.swift index d5366a3f7a..02b0555e94 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.CardStyle.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.CardStyle.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Description.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Description.swift index 29cc72043e..acdd7b88e3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Description.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Description.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.IconSize.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.IconSize.swift index 07c3e11c6c..7c2da0a8ec 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.IconSize.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.IconSize.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Style.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Style.swift index d5f1b0d61b..1f759d12ea 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Style.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.Style.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.swift index 3e752cb251..b57f540b38 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Link.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Relation.swift index f7aee56984..7e7027b793 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Smartblock.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Smartblock.swift index f1da349474..feaf83c2c0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Smartblock.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Smartblock.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Table.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Table.swift index a589c6d8b1..b1a6658ae8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Table.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Table.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableColumn.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableColumn.swift index b3c3460614..3a879f478e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableColumn.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableColumn.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableOfContents.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableOfContents.swift index 64046279f5..0fb61c26c3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableOfContents.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableOfContents.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableRow.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableRow.swift index 6499216824..f1e94ece81 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableRow.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.TableRow.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Mark.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Mark.swift index 35028490d7..b92189a4ed 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Mark.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Mark.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Marks.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Marks.swift index e9b51c39a1..0833cea3fc 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Marks.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Marks.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Style.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Style.swift index 9ea239bd24..e4a9487491 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Style.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.Style.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.swift index a3d4956b60..66d9fd67ee 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Text.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.Layout.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.Layout.swift index 4d88b949b7..098f8806f6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.Layout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.Layout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.swift index 6dffa51e10..280d760681 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.Widget.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.swift index b2f66478c6..101cc7f828 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Content.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.OneOf_Content.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.OneOf_Content.swift index af78f429de..9bf140f381 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.OneOf_Content.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.OneOf_Content.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Position.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Position.swift index 6b56b3f08f..f46d9c1ccd 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Position.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Position.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Restrictions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Restrictions.swift index ad77e172fe..47bc0ed51e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Restrictions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.Restrictions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.VerticalAlign.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.VerticalAlign.swift index 8b3837991c..10a57c7724 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.VerticalAlign.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.VerticalAlign.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.swift index eb2df4732f..a1954290e7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Block.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_BlockMetaOnly.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_BlockMetaOnly.swift index f60dc52fe1..57140269df 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_BlockMetaOnly.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_BlockMetaOnly.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.AttachmentType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.AttachmentType.swift index 79e8fb4ff7..f83d8f8051 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.AttachmentType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.AttachmentType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.swift index c892be5e19..f52292aabf 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Attachment.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.MessageContent.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.MessageContent.swift index 1dde864adf..d28059110e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.MessageContent.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.MessageContent.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.IdentityList.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.IdentityList.swift index ea50ac21c9..1212bcd716 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.IdentityList.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.IdentityList.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.swift index 02c1e8a775..7eb471f5c2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.Reactions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.swift index c447e00b15..8277fed378 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatMessage.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.UnreadState.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.UnreadState.swift index 821738116c..ca61f0d698 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.UnreadState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.UnreadState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.swift index 056695c4cb..450b0ba7ec 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ChatState.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Detail.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Detail.swift index 18239d0285..3deb80da71 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Detail.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Detail.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceInfo.swift index b4e2667c99..0a5dc8b46b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceNetworkType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceNetworkType.swift index a4e793054b..8f268b0733 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceNetworkType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_DeviceNetworkType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.Format.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.Format.swift index cbefc82915..602de16578 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.Format.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.Format.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.swift index e740c580c0..7464a7d80e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileEncryptionKey.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileEncryptionKey.swift index 65aa758481..eb4494a353 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileEncryptionKey.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileEncryptionKey.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileIndexingStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileIndexingStatus.swift index d46780f855..435fe12c4c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileIndexingStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileIndexingStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileInfo.swift index 45bb448d0a..1331a1da31 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_FileInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_IdentityProfile.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_IdentityProfile.swift index a50f465da5..9f626f0915 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_IdentityProfile.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_IdentityProfile.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ImageKind.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ImageKind.swift index ce247858be..a6ec200f01 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ImageKind.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ImageKind.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.ErrorCode.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.ErrorCode.swift index 5452868bbb..cdc437adf8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.ErrorCode.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.ErrorCode.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.TypeEnum.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.TypeEnum.swift index 286fac925d..8a56537f3d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.TypeEnum.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.TypeEnum.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.swift index 470a689cee..5904ba6b8d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Import.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.Value.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.Value.swift index c03067c4c3..1fbe8a964e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.Value.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.Value.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.swift index 296abc9888..0587dc9e84 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InternalFlag.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Invite.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Invite.swift index f852ef3458..008d22986a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Invite.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Invite.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InvitePayload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InvitePayload.swift index 1d9608a157..1a843b0906 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InvitePayload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InvitePayload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ @@ -19,6 +19,10 @@ public struct Anytype_Model_InvitePayload: Sendable { public var creatorName: String = String() + public var creatorIconCid: String = String() + + public var creatorIconEncryptionKeys: [Anytype_Model_FileEncryptionKey] = [] + public var aclKey: Data = Data() public var spaceID: String = String() @@ -27,6 +31,10 @@ public struct Anytype_Model_InvitePayload: Sendable { public var spaceIconCid: String = String() + public var spaceIconOption: UInt32 = 0 + + public var spaceUxType: UInt32 = 0 + public var spaceIconEncryptionKeys: [Anytype_Model_FileEncryptionKey] = [] public var inviteType: Anytype_Model_InviteType = .member @@ -40,7 +48,7 @@ public struct Anytype_Model_InvitePayload: Sendable { extension Anytype_Model_InvitePayload: SwiftProtobuf.Message, SwiftProtobuf._MessageImplementationBase, SwiftProtobuf._ProtoNameProviding { public static let protoMessageName: String = _protobuf_package + ".InvitePayload" - public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}creatorIdentity\0\u{1}creatorName\0\u{1}aclKey\0\u{1}spaceId\0\u{1}spaceName\0\u{1}spaceIconCid\0\u{1}spaceIconEncryptionKeys\0\u{1}inviteType\0\u{1}guestKey\0") + public static let _protobuf_nameMap = SwiftProtobuf._NameMap(bytecode: "\0\u{1}creatorIdentity\0\u{1}creatorName\0\u{1}aclKey\0\u{1}spaceId\0\u{1}spaceName\0\u{1}spaceIconCid\0\u{1}spaceIconEncryptionKeys\0\u{1}inviteType\0\u{1}guestKey\0\u{1}spaceIconOption\0\u{1}spaceUxType\0\u{1}creatorIconCid\0\u{1}creatorIconEncryptionKeys\0") public mutating func decodeMessage(decoder: inout D) throws { while let fieldNumber = try decoder.nextFieldNumber() { @@ -57,6 +65,10 @@ extension Anytype_Model_InvitePayload: SwiftProtobuf.Message, SwiftProtobuf._Mes case 7: try { try decoder.decodeRepeatedMessageField(value: &self.spaceIconEncryptionKeys) }() case 8: try { try decoder.decodeSingularEnumField(value: &self.inviteType) }() case 9: try { try decoder.decodeSingularBytesField(value: &self.guestKey) }() + case 10: try { try decoder.decodeSingularUInt32Field(value: &self.spaceIconOption) }() + case 11: try { try decoder.decodeSingularUInt32Field(value: &self.spaceUxType) }() + case 12: try { try decoder.decodeSingularStringField(value: &self.creatorIconCid) }() + case 13: try { try decoder.decodeRepeatedMessageField(value: &self.creatorIconEncryptionKeys) }() default: break } } @@ -90,16 +102,32 @@ extension Anytype_Model_InvitePayload: SwiftProtobuf.Message, SwiftProtobuf._Mes if !self.guestKey.isEmpty { try visitor.visitSingularBytesField(value: self.guestKey, fieldNumber: 9) } + if self.spaceIconOption != 0 { + try visitor.visitSingularUInt32Field(value: self.spaceIconOption, fieldNumber: 10) + } + if self.spaceUxType != 0 { + try visitor.visitSingularUInt32Field(value: self.spaceUxType, fieldNumber: 11) + } + if !self.creatorIconCid.isEmpty { + try visitor.visitSingularStringField(value: self.creatorIconCid, fieldNumber: 12) + } + if !self.creatorIconEncryptionKeys.isEmpty { + try visitor.visitRepeatedMessageField(value: self.creatorIconEncryptionKeys, fieldNumber: 13) + } try unknownFields.traverse(visitor: &visitor) } public static func ==(lhs: Anytype_Model_InvitePayload, rhs: Anytype_Model_InvitePayload) -> Bool { if lhs.creatorIdentity != rhs.creatorIdentity {return false} if lhs.creatorName != rhs.creatorName {return false} + if lhs.creatorIconCid != rhs.creatorIconCid {return false} + if lhs.creatorIconEncryptionKeys != rhs.creatorIconEncryptionKeys {return false} if lhs.aclKey != rhs.aclKey {return false} if lhs.spaceID != rhs.spaceID {return false} if lhs.spaceName != rhs.spaceName {return false} if lhs.spaceIconCid != rhs.spaceIconCid {return false} + if lhs.spaceIconOption != rhs.spaceIconOption {return false} + if lhs.spaceUxType != rhs.spaceUxType {return false} if lhs.spaceIconEncryptionKeys != rhs.spaceIconEncryptionKeys {return false} if lhs.inviteType != rhs.inviteType {return false} if lhs.guestKey != rhs.guestKey {return false} diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InviteType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InviteType.swift index f25859e0e9..8624a18865 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InviteType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_InviteType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Layout.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Layout.swift index de122cda53..64af5f9d15 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Layout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Layout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.TypeEnum.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.TypeEnum.swift index 0a65cf79f5..a7788d51f3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.TypeEnum.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.TypeEnum.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.swift index d44e2676c3..9976d0d128 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_LinkPreview.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ManifestInfo.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ManifestInfo.swift index bd980a3cb0..a9caa6395f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ManifestInfo.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ManifestInfo.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.EmailVerificationStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.EmailVerificationStatus.swift index 364019ac7a..3f879249ba 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.EmailVerificationStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.EmailVerificationStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.PaymentMethod.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.PaymentMethod.swift index eeac4c589c..db12d0590c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.PaymentMethod.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.PaymentMethod.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.Status.swift index ca654dbd75..b61a8b9f48 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.swift index 48fecb8858..6061b602e9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Membership.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.PeriodType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.PeriodType.swift index b30e39f831..9fddafff8b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.PeriodType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.PeriodType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.swift index e06f06c22d..a610de65fb 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_MembershipTierData.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.OneOf_Payload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.OneOf_Payload.swift index 6c507ca9d5..78216bb0c4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.OneOf_Payload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.OneOf_Payload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.IdentityPayload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.IdentityPayload.swift index 58f219449f..fc6e4c08be 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.IdentityPayload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.IdentityPayload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.swift index f42cd4b402..edef5cf8d6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.Payload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.swift index d620f8a26c..44abd48b92 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Metadata.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_NameserviceNameType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_NameserviceNameType.swift index f21c054d67..a139d83988 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_NameserviceNameType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_NameserviceNameType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ActionType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ActionType.swift index a437ca66d6..6007ee4bfa 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ActionType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ActionType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.Code.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.Code.swift index 8d82e897ae..f128d79dc7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.Code.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.Code.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.swift index 3d445156ce..412bea65a3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Export.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.GalleryImport.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.GalleryImport.swift index c7237a7344..9a02ce197e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.GalleryImport.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.GalleryImport.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Import.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Import.swift index 4bec446d8b..8fa7aab7a0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Import.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Import.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.OneOf_Payload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.OneOf_Payload.swift index afe8f9d9da..0b8fec78fe 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.OneOf_Payload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.OneOf_Payload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantPermissionsChange.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantPermissionsChange.swift index f5892bbd67..05f92de154 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantPermissionsChange.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantPermissionsChange.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRemove.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRemove.swift index fb87c0bf94..6a9749c909 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRemove.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRemove.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestApproved.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestApproved.swift index 30ebaefbe1..50f637676a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestApproved.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestApproved.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestDecline.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestDecline.swift index e5275cbe83..21b3ffea7c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestDecline.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.ParticipantRequestDecline.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToJoin.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToJoin.swift index a96262f420..08a4ce1832 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToJoin.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToJoin.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToLeave.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToLeave.swift index c53716219c..366e329c2a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToLeave.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.RequestToLeave.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Status.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Status.swift index 2da9489eda..f75ab1c39c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Status.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Status.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Test.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Test.swift index 64c6c50e0a..dd7f67a3c2 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Test.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.Test.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.swift index d66fa4f474..2e04d9ca63 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Notification.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.ChangePayload.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.ChangePayload.swift index afb62ff3ff..1de756b88e 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.ChangePayload.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.ChangePayload.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.swift index b5d7805ecb..a1392ebee5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Object.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectOrigin.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectOrigin.swift index 7dd5ee2abd..8c947cdd9d 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectOrigin.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectOrigin.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.Layout.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.Layout.swift index 201f0c8b4d..44bd50d5de 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.Layout.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.Layout.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.swift index f43e12f999..2e5b629375 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.BlockParticipant.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.BlockParticipant.swift index ddc85a2875..1da6233cb3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.BlockParticipant.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.BlockParticipant.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.DetailsSet.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.DetailsSet.swift index a57a17f157..cdedc300b1 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.DetailsSet.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.DetailsSet.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.HistorySize.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.HistorySize.swift index 7c2de5ab18..c067085ca6 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.HistorySize.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.HistorySize.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.RelationWithValuePerObject.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.RelationWithValuePerObject.swift index 32afb6279a..eb1ad396c9 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.RelationWithValuePerObject.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.RelationWithValuePerObject.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.swift index df88c8497d..7c0f41600c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ObjectView.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissionChange.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissionChange.swift index 62a7aafc10..6f0fcf413b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissionChange.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissionChange.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissions.swift index a8dabbbe70..33b0b31b65 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantPermissions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantStatus.swift index 3a09e5007c..c4d11256c8 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_ParticipantStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Range.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Range.swift index 7260fc811e..779b9f7563 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Range.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Range.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.DataSource.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.DataSource.swift index 89142adc46..f40c23c765 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.DataSource.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.DataSource.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Option.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Option.swift index 9befef3b5c..bd04db35b4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Option.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Option.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Scope.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Scope.swift index dd51ce0dd7..cece8265ea 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Scope.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.Scope.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.swift index 803be8f473..9788244308 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relation.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationFormat.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationFormat.swift index 73a461185c..d0d49b4a8c 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationFormat.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationFormat.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationLink.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationLink.swift index d3d2fd8fe1..3fc8bc10c4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationLink.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationLink.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationOptions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationOptions.swift index 78059cc604..93ff7e9d9a 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationOptions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationOptions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationWithValue.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationWithValue.swift index 774e65357d..807c085e41 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationWithValue.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_RelationWithValue.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relations.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relations.swift index 4c2ef82df6..72219f4a6f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relations.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Relations.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestriction.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestriction.swift index bcb3d23fd2..a8afc7bf61 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestriction.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestriction.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestrictions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestrictions.swift index 54bb255b09..6830f4cfad 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestrictions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.DataviewRestrictions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.ObjectRestriction.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.ObjectRestriction.swift index b2dec29ffc..afaad648c4 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.ObjectRestriction.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.ObjectRestriction.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.swift index 1402313ab6..475f7ce186 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Restrictions.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Meta.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Meta.swift index d6709b8bdc..2bee8e7b43 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Meta.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Meta.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Result.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Result.swift index d1b8f80744..8b874ebf55 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Result.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.Result.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.swift index cf4f86041d..6ddd26ea31 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_Search.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockSnapshotBase.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockSnapshotBase.swift index d886d76733..62bbd7477f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockSnapshotBase.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockSnapshotBase.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockType.swift index 3956e6a386..e54cc6a8b3 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SmartBlockType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceAccessType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceAccessType.swift index d346d1c107..1b3cc709d7 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceAccessType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceAccessType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceObjectHeader.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceObjectHeader.swift index 998c1f21f2..1ceed83ce5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceObjectHeader.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceObjectHeader.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceShareableStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceShareableStatus.swift index 6e6e27b82f..7c23832cc0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceShareableStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceShareableStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceStatus.swift index 0f88e72975..95565316d5 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceUxType.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceUxType.swift index c2458d6e7a..040f67c0b0 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceUxType.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SpaceUxType.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncError.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncError.swift index e19f512046..0889f4be7b 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncError.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncError.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncStatus.swift b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncStatus.swift index d522ee39fc..4779316219 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncStatus.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/Models/Anytype_Model_SyncStatus.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/models.proto +// Source: models.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/ProtobufMessages/Sources/Protocol/localstore.pb.swift b/Modules/ProtobufMessages/Sources/Protocol/localstore.pb.swift index d8a6daf784..af11be260f 100644 --- a/Modules/ProtobufMessages/Sources/Protocol/localstore.pb.swift +++ b/Modules/ProtobufMessages/Sources/Protocol/localstore.pb.swift @@ -3,7 +3,7 @@ // swiftlint:disable all // // Generated by the Swift generator plugin for the protocol buffer compiler. -// Source: pkg/lib/pb/model/protos/localstore.proto +// Source: localstore.proto // // For information on using the generated types, please see the documentation: // https://github.com/apple/swift-protobuf/ diff --git a/Modules/Services/Sources/Models/ChatModels.swift b/Modules/Services/Sources/Models/ChatModels.swift index b466aa8340..e3a8186d34 100644 --- a/Modules/Services/Sources/Models/ChatModels.swift +++ b/Modules/Services/Sources/Models/ChatModels.swift @@ -10,6 +10,7 @@ public typealias ChatMessagesReadType = Anytype_Rpc.Chat.ReadMessages.ReadType public typealias ChatUnreadReadType = Anytype_Rpc.Chat.Unread.ReadType public typealias ChatUpdateState = Anytype_Event.Chat.UpdateState public typealias ChatAddData = Anytype_Event.Chat.Add +public typealias ChatDeleteData = Anytype_Event.Chat.Delete public extension ChatMessage { var createdAtDate: Date { diff --git a/Modules/Services/Sources/Models/Extensions/DetailsLayoutExtension.swift b/Modules/Services/Sources/Models/Extensions/DetailsLayoutExtension.swift index 58ce2b100c..0f991cab93 100644 --- a/Modules/Services/Sources/Models/Extensions/DetailsLayoutExtension.swift +++ b/Modules/Services/Sources/Models/Extensions/DetailsLayoutExtension.swift @@ -1,5 +1,3 @@ -import AnytypeCore - public extension DetailsLayout { static let editorLayouts: [DetailsLayout] = [ .note, .basic, .profile, .todo ] @@ -8,34 +6,58 @@ public extension DetailsLayout { static let fileLayouts: [DetailsLayout] = [ .file, .pdf ] static let mediaLayouts: [DetailsLayout] = [ .image, .audio, .video ] static let fileAndMediaLayouts = DetailsLayout.fileLayouts + DetailsLayout.mediaLayouts - static let chatLayouts: [DetailsLayout] = FeatureFlags.multichats ? [.chatDerived] : [] - - static let visibleLayouts: [DetailsLayout] = listLayouts + editorLayouts + [.bookmark, .participant, .date, .objectType] + chatLayouts - static let visibleLayoutsWithFiles = visibleLayouts + fileAndMediaLayouts - - static let supportedForCreation: [DetailsLayout] = supportedForCreationInSets + listLayouts + chatLayouts + + fileprivate static let visibleLayoutsBase: [DetailsLayout] = listLayouts + editorLayouts + [.bookmark, .date, .objectType] + chatLayouts + fileprivate static let visibleLayoutsWithFilesBase = visibleLayoutsBase + fileAndMediaLayouts + + fileprivate static let supportedForCreationBase: [DetailsLayout] = supportedForCreationInSets + listLayouts + chatLayouts static let supportedForSharingExtension: [DetailsLayout] = [.collection] + editorLayouts - - static let widgetTypeLayouts = listLayouts + editorLayouts + [.bookmark] + fileAndMediaLayouts + chatLayouts - - private static let supportedForOpening: [DetailsLayout] = visibleLayoutsWithFiles + [.objectType] + + fileprivate static let widgetTypeLayoutsBase = listLayouts + editorLayouts + [.bookmark] + fileAndMediaLayouts + chatLayouts + + private static let supportedForOpening: [DetailsLayout] = visibleLayoutsWithFilesBase + [.objectType, .participant] private static let supportedForCreationInSets: [DetailsLayout] = editorLayouts + [.bookmark] + listLayouts private static let layoutsWithIcon: [DetailsLayout] = listLayouts + fileAndMediaLayouts + [.basic, .profile, .objectType] private static let layoutsWithCover: [DetailsLayout] = layoutsWithIcon + [.bookmark, .todo] + private static let chatLayouts: [DetailsLayout] = [.chatDerived] +} + +// MARK: - Space-aware filtering + +public extension DetailsLayout { + static func visibleLayouts(spaceUxType: SpaceUxType?) -> [DetailsLayout] { + guard !spaceUxType.supportsMultiChats else { return visibleLayoutsBase } + return visibleLayoutsBase.filter { $0 != .chatDerived } + } + + static func visibleLayoutsWithFiles(spaceUxType: SpaceUxType?) -> [DetailsLayout] { + guard !spaceUxType.supportsMultiChats else { return visibleLayoutsWithFilesBase } + return visibleLayoutsWithFilesBase.filter { $0 != .chatDerived } + } + + static func supportedForCreation(spaceUxType: SpaceUxType?) -> [DetailsLayout] { + guard !spaceUxType.supportsMultiChats else { return supportedForCreationBase } + return supportedForCreationBase.filter { $0 != .chatDerived } + } + + static func widgetTypeLayouts(spaceUxType: SpaceUxType?) -> [DetailsLayout] { + guard !spaceUxType.supportsMultiChats else { return widgetTypeLayoutsBase } + return widgetTypeLayoutsBase.filter { $0 != .chatDerived } + } } // MARK: - Computed properties public extension DetailsLayout { - var isVisible: Bool { DetailsLayout.visibleLayouts.contains(self) } - var isVisibleOrFile: Bool { DetailsLayout.visibleLayoutsWithFiles.contains(self) } + var isVisible: Bool { DetailsLayout.visibleLayoutsBase.contains(self) } + var isVisibleOrFile: Bool { DetailsLayout.visibleLayoutsWithFilesBase.contains(self) } var isEditorLayout: Bool { DetailsLayout.editorLayouts.contains(self) } var isFile: Bool { Self.fileLayouts.contains(self) } var isFileOrMedia: Bool { Self.fileAndMediaLayouts.contains(self) } var isSupportedForCreationInSets: Bool { Self.supportedForCreationInSets.contains(self) } var isSupportedForOpening: Bool { Self.supportedForOpening.contains(self) } - var isSupportedForCreation: Bool { Self.supportedForCreation.contains(self) } + var isSupportedForCreation: Bool { Self.supportedForCreationBase.contains(self) } var haveIcon: Bool { Self.layoutsWithIcon.contains(self) } var haveCover: Bool { Self.layoutsWithCover.contains(self) } diff --git a/Modules/Services/Sources/Models/ObjectType.swift b/Modules/Services/Sources/Models/ObjectType.swift index cea356abdc..2336200519 100644 --- a/Modules/Services/Sources/Models/ObjectType.swift +++ b/Modules/Services/Sources/Models/ObjectType.swift @@ -146,9 +146,11 @@ extension ObjectType: DetailsModel { } public var isTemplateType: Bool { uniqueKey == .template } - + public var isDateType: Bool { uniqueKey == .date } - + + public var isChatType: Bool { uniqueKey == .chatDerived } + // MARK: - Layout proxy public var isListType: Bool { recommendedLayout.isList } diff --git a/Modules/Services/Sources/Models/Space/SpaceUxType+Extensions.swift b/Modules/Services/Sources/Models/Space/SpaceUxType+Extensions.swift index a92cb30bd1..a164ff32a0 100644 --- a/Modules/Services/Sources/Models/Space/SpaceUxType+Extensions.swift +++ b/Modules/Services/Sources/Models/Space/SpaceUxType+Extensions.swift @@ -4,13 +4,28 @@ public extension SpaceUxType { var isStream: Bool { self == .stream } - + var isChat: Bool { self == .chat } - + var isData: Bool { self == .data } + + var supportsMultiChats: Bool { + switch self { + case .chat, .stream, .none, .UNRECOGNIZED: + return false + case .data: + return true + } + } +} + +public extension Optional where Wrapped == SpaceUxType { + var supportsMultiChats: Bool { + self?.supportsMultiChats ?? true + } } diff --git a/Modules/Services/Sources/Models/SubscriptionData/SubscriptionData.swift b/Modules/Services/Sources/Models/SubscriptionData/SubscriptionData.swift index cc2195c5b3..155b75f503 100644 --- a/Modules/Services/Sources/Models/SubscriptionData/SubscriptionData.swift +++ b/Modules/Services/Sources/Models/SubscriptionData/SubscriptionData.swift @@ -1,6 +1,7 @@ public enum SubscriptionData: Equatable, Sendable { case search(Search) case objects(Object) + case crossSpaceSearch(CrossSpaceSearch) } extension SubscriptionData { @@ -70,4 +71,32 @@ extension SubscriptionData { self.ignoreWorkspace = ignoreWorkspace } } + + public struct CrossSpaceSearch: Equatable, Sendable { + public let identifier: String + public let sorts: [DataviewSort] + public let filters: [DataviewFilter] + public let keys: [String] + public let source: [String]? + public let noDepSubscription: Bool + public let collectionId: String? + + public init( + identifier: String, + sorts: [DataviewSort] = [], + filters: [DataviewFilter], + keys: [String], + source: [String]? = nil, + noDepSubscription: Bool = false, + collectionId: String? = nil + ) { + self.identifier = identifier + self.sorts = sorts + self.filters = filters + self.keys = keys + self.source = source + self.noDepSubscription = noDepSubscription + self.collectionId = collectionId + } + } } diff --git a/Modules/Services/Sources/Services/ObjectSubscriptionService/ObjectSubscriptionService.swift b/Modules/Services/Sources/Services/ObjectSubscriptionService/ObjectSubscriptionService.swift index f1d51d231a..86bd1fc75e 100644 --- a/Modules/Services/Sources/Services/ObjectSubscriptionService/ObjectSubscriptionService.swift +++ b/Modules/Services/Sources/Services/ObjectSubscriptionService/ObjectSubscriptionService.swift @@ -3,6 +3,7 @@ import ProtobufMessages public protocol ObjectSubscriptionServiceProtocol: Sendable { func objectSubscribe(data: SubscriptionData.Object) async throws -> ObjectSubscriptionResponse func objectSearchSubscribe(data: SubscriptionData.Search) async throws -> ObjectSubscriptionResponse + func objectCrossSpaceSearchSubscribe(data: SubscriptionData.CrossSpaceSearch) async throws -> ObjectSubscriptionResponse func stopSubscriptions(ids: [String]) async throws } @@ -48,6 +49,25 @@ final class ObjectSubscriptionService: ObjectSubscriptionServiceProtocol { ) } + func objectCrossSpaceSearchSubscribe(data: SubscriptionData.CrossSpaceSearch) async throws -> ObjectSubscriptionResponse { + let result = try await ClientCommands.objectCrossSpaceSearchSubscribe(.with { + $0.subID = data.identifier + $0.filters = data.filters + $0.sorts = data.sorts.map { $0.fixIncludeTime() } + $0.keys = data.keys + $0.source = data.source ?? [] + $0.noDepSubscription = data.noDepSubscription + $0.collectionID = data.collectionId ?? "" + }).invoke() + return ObjectSubscriptionResponse( + records: result.records.asDetais, + dependencies: result.dependencies.asDetais, + total: Int(result.counters.total), + prevCount: Int(result.counters.prevCount), + nextCount: Int(result.counters.nextCount) + ) + } + public func stopSubscriptions(ids: [String]) async throws { try await ClientCommands.objectSearchUnsubscribe(.with { $0.subIds = ids diff --git a/Modules/Services/Sources/Services/SearchService/SearchFiltersBuilder.swift b/Modules/Services/Sources/Services/SearchService/SearchFiltersBuilder.swift index 21714f809a..5bf6beadeb 100644 --- a/Modules/Services/Sources/Services/SearchService/SearchFiltersBuilder.swift +++ b/Modules/Services/Sources/Services/SearchService/SearchFiltersBuilder.swift @@ -5,11 +5,15 @@ public final class SearchFiltersBuilder { SearchHelper.notHiddenFilters(isArchive: isArchived) } } - - public static func build(isArchived: Bool, layouts: [DetailsLayout]) -> [DataviewFilter] { + + public static func build(isArchived: Bool, layouts: [DetailsLayout], spaceUxType: SpaceUxType?) -> [DataviewFilter] { var filters = build(isArchived: isArchived) filters.append(SearchHelper.layoutFilter(layouts)) filters.append(SearchHelper.templateScheme(include: false)) + if !spaceUxType.supportsMultiChats { + filters.append(SearchHelper.filterOutChatType()) + } + filters.append(SearchHelper.filterOutParticipantType()) return filters } } diff --git a/Modules/Services/Sources/Services/SearchService/SearchHelper.swift b/Modules/Services/Sources/Services/SearchService/SearchHelper.swift index 7c867d579f..1d1d5965f3 100644 --- a/Modules/Services/Sources/Services/SearchService/SearchHelper.swift +++ b/Modules/Services/Sources/Services/SearchService/SearchHelper.swift @@ -264,7 +264,25 @@ public class SearchHelper { return filter } - + + public static func filterOutChatType() -> DataviewFilter { + var filter = DataviewFilter() + filter.condition = .notEqual + filter.relationKey = "\(BundledPropertyKey.uniqueKey.rawValue)" + filter.value = ObjectTypeUniqueKey.chatDerived.value.protobufValue + + return filter + } + + public static func filterOutParticipantType() -> DataviewFilter { + var filter = DataviewFilter() + filter.condition = .notEqual + filter.relationKey = "\(BundledPropertyKey.uniqueKey.rawValue)" + filter.value = ObjectTypeUniqueKey.participant.value.protobufValue + + return filter + } + public static func filterOutTypeType() -> DataviewFilter { var filter = DataviewFilter() filter.condition = .notEqual diff --git a/Scripts/install-swiftprotobuf.sh b/Scripts/install-swiftprotobuf.sh new file mode 100755 index 0000000000..a4648f1eae --- /dev/null +++ b/Scripts/install-swiftprotobuf.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# ./Scripts/install-swiftprotobuf.sh +# Clones apple/swift-protobuf (if missing), checks out a specific version, and builds a release. + +set -euo pipefail + +# ===== Settings ===== +# Set the desired release tag here (examples: 1.26.0, 1.25.2). No env override. +SWIFT_PROTOBUF_VERSION="1.32.0" +REPO_URL="https://github.com/apple/swift-protobuf" + +# Project root = one level above Scripts/ +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)" + +# Clone destination +BUILD_DIR="${ROOT_DIR}/build" +CLONE_DIR="${BUILD_DIR}/swift-protobuf" + +# ===== Clone (if needed) ===== +mkdir -p "${BUILD_DIR}" + +if [ ! -d "${CLONE_DIR}/.git" ]; then + echo "âžĄī¸ Cloning ${REPO_URL} into ${CLONE_DIR}..." + git clone "${REPO_URL}" "${CLONE_DIR}" +else + echo "â„šī¸ Repository already exists at ${CLONE_DIR}." +fi + +# ===== Fetch tags and checkout version ===== +echo "âžĄī¸ Fetching tags..." +git -C "${CLONE_DIR}" fetch --all --tags --prune + +pushd "${CLONE_DIR}" >/dev/null + +# Support tags with and without 'v' prefix +if git rev-parse -q --verify "refs/tags/${SWIFT_PROTOBUF_VERSION}" >/dev/null; then + TAG="refs/tags/${SWIFT_PROTOBUF_VERSION}" +elif git rev-parse -q --verify "refs/tags/v${SWIFT_PROTOBUF_VERSION}" >/dev/null; then + TAG="refs/tags/v${SWIFT_PROTOBUF_VERSION}" +else + echo "❌ Tag ${SWIFT_PROTOBUF_VERSION} (or v${SWIFT_PROTOBUF_VERSION}) not found in ${REPO_URL}." >&2 + echo " Tip: list available versions with: git -C ${CLONE_DIR} tag -l" >&2 + exit 1 +fi + +echo "âžĄī¸ Checking out ${TAG}..." +git checkout -q "${TAG}" +git submodule update --init --recursive + +# ===== Build (release) ===== +echo "âžĄī¸ Building (SwiftPM, release)..." +swift build -c release + +popd >/dev/null + +# ===== Done ===== +echo "✅ Done." +echo " Repository: ${CLONE_DIR}" +echo " Build dir: ${CLONE_DIR}/.build/release" +echo " Version: ${SWIFT_PROTOBUF_VERSION}" \ No newline at end of file diff --git a/Scripts/middle-download.sh b/Scripts/middle-download.sh index aa33df52a6..324f238aaa 100755 --- a/Scripts/middle-download.sh +++ b/Scripts/middle-download.sh @@ -7,6 +7,11 @@ PROJECT_DIR=${BASEDIR}/.. CACHE_DIR=${PROJECT_DIR}/.libcache CACHE_LIMIT=10 +#Colors +RED='\033[0;31m' +GREEN='\033[0;32m' +RESET='\033[0m' + . ${BASEDIR}/common.sh --source-only source Libraryfile @@ -33,9 +38,8 @@ if [[ ! -f "$LIB_PATH" ]]; then LIB_PATH_TMP=${CACHE_DIR}/lib-tmp.gz if ! curl https://maven.pkg.github.com/anyproto/anytype-heart/io.anyproto/anytype-heart-ios/${MIDDLE_VERSION}/anytype-heart-ios-${MIDDLE_VERSION}.gz -f --header "Authorization: token ${token}" -L --output ${LIB_PATH_TMP}; then - RED='\033[0;31m' - TERMINATOR='\n\e[0m' - printf "${RED}Error downloading middleware, check out token provided${TERMINATOR}" + + printf "${RED}Error downloading middleware, check out token provided${RESET}" printf "use \"make change-github-token\" command to update token" exit 1 fi @@ -62,6 +66,5 @@ if [[ -d "$CACHE_DIR" ]]; then fi fi -GREEN='\033[0;32m' -printf "${GREEN}Success" +printf "${GREEN}Success${RESET}" echo -e "\a" # play sound \ No newline at end of file diff --git a/fastlane/.env b/fastlane/.env index af8e6bb119..64703ce327 100644 --- a/fastlane/.env +++ b/fastlane/.env @@ -7,22 +7,17 @@ APP_TARGET = "Anytype" APP_CONF_DEVELOP = "Release-Nightly" APP_CONF_RELEASE_ANYTYPE = "Release-Anytype" -APP_CONF_RELEASE_ANYAPP = "Release-AnyApp" APP_ID_DEVELOP = "io.anytype.app.dev" APP_ID_RELEASE_ANYTYPE = "io.anytype.app" -APP_ID_RELEASE_ANYAPP = "org.any.app" APP_WIDGET_ID_DEVELOP = "io.anytype.app.dev.homewidget" APP_WIDGET_ID_RELEASE_ANYTYPE = "io.anytype.app.homewidget" -APP_WIDGET_ID_RELEASE_ANYAPP = "org.any.app.homewidget" APP_SHARE_EXTENSION_ID_DEVELOP = "io.anytype.app.dev.AnytypeShareExtension" APP_SHARE_EXTENSION_ID_RELEASE_ANYTYPE = "io.anytype.app.AnytypeShareExtension" -APP_SHARE_EXTENSION_ID_RELEASE_ANYAPP = "org.any.app.AnytypeShareExtension" APP_NOTIFICATION_EXTENSION_ID_DEVELOP = "io.anytype.app.dev.AnytypeNotificationExtension" APP_NOTIFICATION_EXTENSION_ID_RELEASE_ANYTYPE = "io.anytype.app.AnytypeNotificationExtension" -APP_NOTIFICATION_EXTENSION_ID_RELEASE_ANYAPP = "org.any.app.AnytypeNotificationExtension" APPLE_ID = "iosteam@anytype.io" \ No newline at end of file diff --git a/fastlane/Appfile b/fastlane/Appfile index 8b74d0fdd4..6ad228caa6 100644 --- a/fastlane/Appfile +++ b/fastlane/Appfile @@ -24,8 +24,3 @@ for_lane :release_anytype do apple_id(ENV["APPLE_ID"]) app_identifier(ENV["APP_ID_RELEASE_ANYTYPE"]) end - -for_lane :release_anyapp do - apple_id(ENV["APPLE_ID"]) - app_identifier(ENV["APP_ID_RELEASE_ANYAPP"]) -end diff --git a/fastlane/FastfileDeploy b/fastlane/FastfileDeploy index 9ccf2b167f..c1efbd5309 100644 --- a/fastlane/FastfileDeploy +++ b/fastlane/FastfileDeploy @@ -10,10 +10,6 @@ platform :ios do deploy(config: ENV["APP_CONF_RELEASE_ANYTYPE"]) end - lane :release_anyapp do - deploy(config: ENV["APP_CONF_RELEASE_ANYAPP"]) - end - # Private lanes private_lane :deploy do |options| @@ -24,18 +20,15 @@ platform :ios do ENV["APP_CONF_DEVELOP"] => { tag_prefix: "dev", add_badge: true, - app_info: "Debug" + app_info: "Debug", + bundle_id: "io.anytype.app.dev" }, ENV["APP_CONF_RELEASE_ANYTYPE"] => { tag_prefix: "release-anytype", add_badge: false, - app_info: "Release Anytype" - }, - ENV["APP_CONF_RELEASE_ANYAPP"] => { - tag_prefix: "release-anyapp", - add_badge: false, - app_info: "Release Any App" - }, + app_info: "Release Anytype", + bundle_id: "io.anytype.app" + } } setup_ci @@ -108,14 +101,57 @@ platform :ios do sh("git push origin refs/tags/#{tag_name} --no-verify --force") appInfo = settings[:app_info] - old_tag_name = sh("git describe --first-parent --tags --abbrev=0 HEAD~").chomp - add_linear_comment( - from_tag: old_tag_name, - to_tag: tag_name, - comment: "Implemented in **#{appInfo}** `#{version}(#{build_number})`. This comment was created automatically." - ) + # Determine the previous tag to use for diff generation in Linear comments + # This ensures hotfix releases (e.g., 0.41.1) correctly diff against the last build + # of the previous version (0.41.0/27) instead of finding an old tag from a different branch + if build_number.to_i > 1 + # For incremental builds (e.g., 0.41.0/26 -> 0.41.0/27), use the previous build number + old_tag_name = "#{prefix}/#{version}/#{build_number.to_i - 1}" + else + # For the first build of a new version (e.g., 0.41.1/1), find the last tag of the previous patch version + # Get major.minor version (e.g., "0.41" from "0.41.1") + version_parts = version.split('.') + major_minor = "#{version_parts[0]}.#{version_parts[1]}" + current_patch = version_parts[2].to_i + + # Get all tags for the current major.minor (e.g., all 0.41.x tags), sorted by version + all_version_tags = sh("git tag -l '#{prefix}/#{major_minor}.*/*' | sort -V").split("\n") + + # Find tags for versions less than current patch, take the last one + previous_version_tags = all_version_tags.select do |t| + tag_patch = t.match(/#{Regexp.escape(prefix)}\/#{Regexp.escape(major_minor)}\.(\d+)\//) + tag_patch && tag_patch[1].to_i < current_patch + end + + old_tag_name = previous_version_tags.last || tag_name + end + + # Check if we should add Linear comments + # Skip if: (1) old_tag is the same as new tag (first release) + # (2) both tags point to the same commit (retried build) + if old_tag_name == tag_name + puts "â­ī¸ Skipping Linear comments: First release, no previous version to compare" + else + old_commit = sh("git rev-parse #{old_tag_name}^{commit} 2>/dev/null || echo ''").strip + new_commit = sh("git rev-parse #{tag_name}^{commit}").strip + + if old_commit.empty? + puts "âš ī¸ Warning: Could not find commit for #{old_tag_name}, skipping Linear comments" + elsif old_commit == new_commit + puts "â­ī¸ Skipping Linear comments: #{old_tag_name} and #{tag_name} point to the same commit (#{old_commit[0..7]})" + else + add_linear_comment( + from_tag: old_tag_name, + to_tag: tag_name, + comment: "Implemented in **#{appInfo}** `#{version}(#{build_number})`. This comment was created automatically." + ) + end + end + bundle_id = settings[:bundle_id] + ENV["DELIVER_ALTOOL_ADDITIONAL_UPLOAD_PARAMETERS"] = "--apple-id #{bundle_id} --use-old-altool" + upload_to_testflight(skip_waiting_for_build_processing: true) github_message = "Anytype #{appInfo} Version: **#{version}(#{build_number})** :gem::gem::gem:" diff --git a/fastlane/FastfileProfiles b/fastlane/FastfileProfiles index 9b1ec99d8e..2c565ffdcb 100644 --- a/fastlane/FastfileProfiles +++ b/fastlane/FastfileProfiles @@ -14,12 +14,6 @@ platform :ios do # Generate Debug - lane :generate_debug_profiles do - generate_dev_debug_profiles - generate_anytype_debug_profiles - generate_anyapp_debug_profiles - end - lane :generate_dev_debug_profiles do match(force_for_new_devices: true) end @@ -28,18 +22,8 @@ platform :ios do match(force_for_new_devices: true) end - lane :generate_anyapp_debug_profiles do - match(force_for_new_devices: true) - end - # Generate Release - lane :generate_appstore_profiles do - generate_appstore_profiles_for_nightly - generate_appstore_profiles_for_anytype - generate_appstore_profiles_for_anyapp - end - lane :generate_appstore_profiles_for_nightly do match(force: true) end @@ -48,10 +32,6 @@ platform :ios do match(force: true) end - lane :generate_appstore_profiles_for_anyapp do - match(force: true) - end - lane :delete_dev_certs do match_nuke() end diff --git a/fastlane/Matchfile b/fastlane/Matchfile index 9f88648a53..191bd0f69e 100644 --- a/fastlane/Matchfile +++ b/fastlane/Matchfile @@ -17,12 +17,6 @@ APP_ID_ALL_RELEASE_ANYTYPE ||= [ ENV["APP_SHARE_EXTENSION_ID_RELEASE_ANYTYPE"], ENV["APP_NOTIFICATION_EXTENSION_ID_RELEASE_ANYTYPE"] ] -APP_ID_ALL_RELEASE_ANYAPP ||= [ - ENV["APP_ID_RELEASE_ANYAPP"], - ENV["APP_WIDGET_ID_RELEASE_ANYAPP"], - ENV["APP_SHARE_EXTENSION_ID_RELEASE_ANYAPP"], - ENV["APP_NOTIFICATION_EXTENSION_ID_RELEASE_ANYAPP"] -] # For build release @@ -36,11 +30,6 @@ for_lane :release_anytype do app_identifier(APP_ID_ALL_RELEASE_ANYTYPE) end -for_lane :release_anyapp do - type("appstore") - app_identifier(APP_ID_ALL_RELEASE_ANYAPP) -end - for_lane :test_build do type("appstore") app_identifier(APP_ID_ALL_DEVELOP) @@ -63,16 +52,11 @@ for_lane :generate_anytype_debug_profiles do app_identifier(APP_ID_ALL_RELEASE_ANYTYPE) end -for_lane :generate_anyapp_debug_profiles do - type('development') - app_identifier(APP_ID_ALL_RELEASE_ANYAPP) -end - # For Install Debug profiles for_lane :install_debug_profiles do type("development") - app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE + APP_ID_ALL_RELEASE_ANYAPP) + app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE) end # For Generate Release profiles @@ -87,16 +71,11 @@ for_lane :generate_appstore_profiles_for_anytype do app_identifier(APP_ID_ALL_RELEASE_ANYTYPE) end -for_lane :generate_appstore_profiles_for_anyapp do - type("appstore") - app_identifier(APP_ID_ALL_RELEASE_ANYAPP) -end - # For Install Release profiles for_lane :install_appstore_profiles do type("appstore") - app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE + APP_ID_ALL_RELEASE_ANYAPP) + app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE) end # For Delete @@ -108,5 +87,5 @@ end for_lane :delete_appstore_certs do type("appstore") - app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE + APP_ID_ALL_RELEASE_ANYAPP) + app_identifier(APP_ID_ALL_DEVELOP + APP_ID_ALL_RELEASE_ANYTYPE) end \ No newline at end of file diff --git a/fastlane/SetEnv b/fastlane/SetEnv index 13fdcbd40f..0d75ea8912 100644 --- a/fastlane/SetEnv +++ b/fastlane/SetEnv @@ -1,11 +1,6 @@ lane :set_all_env_to_info_plist do |options| set_amplitude_api_key_to_info_plist set_sentry_dsn_to_info_plist - set_openai_token_to_info_plist - set_ai_endpoint_to_info_plist - set_ai_model_to_info_plist - set_anyapp_membership_secret_to_info_plist - set_join_stream_url end lane :set_amplitude_api_key_to_info_plist do |options| @@ -18,48 +13,8 @@ end lane :set_sentry_dsn_to_info_plist do |options| set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", + path: "./Anytype/Supporting files/Info.plist", key: "SentryDSN", value: ENV["SENTRY_DSN"] ) -end - -lane :set_openai_token_to_info_plist do |options| - set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", - key: "OpenAIToken", - value: ENV["OPENAI_TOKEN"] || "" - ) -end - -lane :set_ai_endpoint_to_info_plist do |options| - set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", - key: "AIEndpoint", - value: ENV["AI_ENDPOINT"] || "" - ) -end - -lane :set_ai_model_to_info_plist do |options| - set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", - key: "AIModel", - value: ENV["AI_MODEL"] || "" - ) -end - -lane :set_anyapp_membership_secret_to_info_plist do |options| - set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", - key: "AnyAppMembershipTierSecret", - value: ENV["ANY_APP_MEMBERSHIP_TIER_SECRET"] || "" - ) -end - -lane :set_join_stream_url do |options| - set_info_plist_value( - path: "./Anytype/Supporting files/Info.plist", - key: "JoinStreamURL", - value: ENV["JOIN_STREAM_URL"] || "" - ) end \ No newline at end of file