Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

new documentation website #124

Merged
merged 10 commits into from
Dec 25, 2024
Merged

new documentation website #124

merged 10 commits into from
Dec 25, 2024

Conversation

Nek-12
Copy link
Member

@Nek-12 Nek-12 commented Dec 25, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a quickstart guide for the FlowMVI library to facilitate user onboarding.
    • Added new sections and enhancements to the Android and Compose integration documentation.
    • Created a new manifest file for Progressive Web App (PWA) usage.
    • Added a new FAQ section addressing common issues and troubleshooting tips.
  • Bug Fixes

    • Updated paths in documentation and configuration files to reflect new directory structures.
  • Documentation

    • Enhanced clarity and structure across multiple documentation files, including FAQs, contributing guidelines, and plugin documentation.
    • Removed outdated or redundant documentation files to streamline content.
  • Chores

    • Introduced new configuration and setup files for documentation management, including package.json, docusaurus.config.ts, and tsconfig.json.
    • Updated .gitignore files to better manage ignored files and directories.

Copy link
Contributor

coderabbitai bot commented Dec 25, 2024

Warning

Rate limit exceeded

@Nek-12 has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 21 minutes and 51 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 7dabbac and 0382f2b.

📒 Files selected for processing (4)
  • .github/workflows/docs.yml (1 hunks)
  • README.md (1 hunks)
  • docs/docs/misc/_category_.json (1 hunks)
  • docs/docs/quickstart.md (1 hunks)
📝 Walkthrough

Walkthrough

This pull request introduces a comprehensive restructuring of the documentation system for the FlowMVI project. The changes involve migrating from a previous documentation setup to a new Docusaurus-based documentation framework. The modifications span multiple files across the repository, including workflow configurations, gitignore files, README updates, and a complete overhaul of the documentation structure and tooling.

Changes

File/Directory Change Summary
.github/workflows/ Updated CI and documentation workflows to support Node.js setup, Yarn dependency management, and documentation building
.gitignore Updated to reflect new documentation directory structure
README.md Modified image path for banner
buildSrc/ Updated documentation asset path
docs/ Complete documentation system migration to Docusaurus, including new configuration files, markdown documentation, and static assets
docs/docs/README.md New section added indicating it's a stub for CI processes
docs/docs/integrations/_category_.json New category for integrations added
docs/docs/integrations/android.md Enhanced documentation for Android integration with new examples and clarifications
docs/docs/integrations/compose.md Significant structural and content modifications to improve clarity and usability
docs/docs/integrations/essenty.md Updated dependency section and added warnings for better clarity
docs/docs/misc/FAQ.md New FAQ section added detailing common issues and solutions
docs/docs/plugins/_category_.json New category for plugins added
docs/docs/plugins/debugging.md Enhanced clarity and structure with new warnings and information blocks
docs/docs/plugins/prebuilt.md New sections for Deinit and Reset State plugins added
docs/docusaurus.config.ts New configuration file for Docusaurus introduced
docs/package.json New package.json file for Docusaurus project setup
docs/static/manifest.json New manifest file for PWA usage
docs/static/robots.txt New robots.txt file to manage web crawler access
docs/sidebars.ts New sidebar configuration file added
docs/tsconfig.json New TypeScript configuration file introduced

Sequence Diagram

sequenceDiagram
    participant CI as GitHub Actions
    participant Node as Node.js Setup
    participant Yarn as Dependency Management
    participant Docusaurus as Docusaurus Build
    participant Deploy as Documentation Deployment

    CI->>Node: Set up Node.js v23
    Node->>Yarn: Install dependencies
    Yarn->>Docusaurus: Build documentation
    Docusaurus->>Deploy: Generate static site
Loading

Possibly related PRs

  • 3.1.0 #123: The changes in the .github/workflows/docs.yml file regarding the setup of Node.js and documentation management are related to the main PR's updates in the .github/workflows/ci.yml file, as both involve enhancing the continuous integration process with Node.js setup and documentation handling.

Suggested Labels

autorelease

Poem

🐰 Docs transformed, a rabbit's delight,
Docusaurus shines, pages now bright!
Workflows dance, configurations sing,
A documentation framework takes wing!
FlowMVI's knowledge, now crystal clear! 🌟


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🧹 Nitpick comments (30)
.github/workflows/ci.yml (1)

66-68: Validating website build.
Building the documentation with Yarn ensures all doc components are tested early, which is great. Consider adding a small smoke test on the build artifacts if you suspect potential regressions in the future.

.github/workflows/docs.yml (1)

62-63: Website build step.
Running the Yarn build for Docusaurus ensures the static documentation is ready. Consider running a pre-build test (like linting or link checking) to catch issues before finalizing the build artifacts.

docs/src/css/custom.css (2)

20-27: Consider adjusting the dark mode primary color for better accessibility

The current primary color in dark mode (#00d46a) has a very high saturation which might cause eye strain. Consider using a slightly muted green for better readability while maintaining the brand identity.

[data-theme='dark'] {
-  --ifm-color-primary: #00d46a;
+  --ifm-color-primary: #1abc9c;
   /* adjust other shades accordingly */
}

30-31: Document the reason for commented-out DocSearch variables

The commented variables seem important but lack explanation. Either remove them if unnecessary or document why they're preserved for future reference.

[data-theme='light'] .DocSearch {
-  /* --docsearch-primary-color: var(--ifm-color-primary); */
-  /* --docsearch-text-color: var(--ifm-font-color-base); */
+  /* These variables are handled by Docusaurus theme:
+   * --docsearch-primary-color: var(--ifm-color-primary);
+   * --docsearch-text-color: var(--ifm-font-color-base);
+   */
docs/docs/integrations/android.md (3)

1-4: Add a brief introduction section

The documentation jumps directly into implementation details. Consider adding a brief introduction section explaining what FlowMVI offers for Android developers and when to use each approach.


55-62: Enhance the info block with concrete examples

The info block about KMP compatibility could be more helpful with concrete examples of what features would be lost and how to handle them in a KMP-friendly way.

:::info
The upside of this approach is that it's easier to implement and use some platform-specific features
like `savedState` (you can still use them for KMP though)
The downside is that you lose KMP compatibility. If you have plans to make your ViewModels multiplatform,
it is advised to use the delegated approach instead, which is only slightly more verbose.
+
+For example:
+- Platform-specific features that work: SavedStateHandle, ViewModel scoping
+- Features that need adaptation for KMP: Lifecycle handling, Navigation
+- Alternative approaches for KMP: Use the delegated pattern shown below
:::

105-112: Add code example demonstrating type erasure issue

The warning about type erasure would be clearer with a concrete example of what fails and how to fix it.

:::warning[On type-safety]
Qualifiers are needed because you'll have many `StoreViewModels` that differ only by type of the container. Due to
type erasure, you must inject the VM by specifying a fully-qualified type
e.g. `StoreViewModel<CounterState, CounterIntent, CounterAction>`, or it will be replaced with `Store<*, *, *>` and the
DI framework will fail, likely in runtime.
+
+Example of what fails:
+```kotlin
+// ❌ Will fail at runtime due to type erasure
+val viewModel: StoreViewModel<*, *, *> = get()
+
+// ✅ Correct way with explicit types
+val viewModel: StoreViewModel<CounterState, CounterIntent, CounterAction> = get()
+```
:::
🧰 Tools
🪛 LanguageTool

[uncategorized] ~108-~108: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... you must inject the VM by specifying a fully-qualified type e.g. `StoreViewModel<CounterState,...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

docs/docs/integrations/essenty.md (3)

Line range hint 8-14: Enhance dependency declaration section

The dependency section could be clearer about which features each artifact provides and when to use them.

# Includes retained stores and coroutine scopes
flowmvi-essenty = { module = "pro.respawn.flowmvi:essenty", version.ref = "flowmvi" }
# Includes lifecycle support for store subscription
flowmvi-essenty-compose = { module = "pro.respawn.flowmvi:essenty-compose", version.ref = "flowmvi" }
+
+Choose the dependencies based on your needs:
+- Use `flowmvi-essenty` for basic Decompose integration with store retention
+- Add `flowmvi-essenty-compose` if you're using Jetpack Compose UI

Line range hint 65-76: Improve warning block with code examples

The warning about closure capture would be more effective with concrete examples of what to avoid and how to properly structure the code.

:::warning [Caveat:]
If you do not use the factory DSL and instead build a store that is retained, it will capture everything you
pass into the `builder` closure...
+
+Example of what to avoid:
+```kotlin
+// ❌ This will retain the entire repository instance
+class BadComponent(private val repository: Repository) {
+    val store = retainedStore { /* uses repository directly */ }
+}
+
+// ✅ Use factory to avoid capturing external references
+class GoodComponent(context: ComponentContext) {
+    val store = context.retainedStore(factory = { inject<Repository>() })
+}
+```
:::
🧰 Tools
🪛 LanguageTool

[style] ~69-~69: To make your writing concise, consider an alternative.
Context: ...his is the same caveat that you have to be aware of when using [Retained Components](https:...

(AWARE_OF)


128-133: Expand the tip with specific setup steps

The tip about lifecycle setup could be more helpful with specific steps or common pitfalls to avoid.

:::tip
The requirements for setting up lifecycle correctly are the same as in
the [Decompose docs](https://arkivanov.github.io/Decompose/component/lifecycle/).
+
+Key points to remember:
+1. Ensure ComponentContext is properly initialized
+2. Don't forget to call Lifecycle.resume() in your root component
+3. Handle backstack navigation correctly to prevent memory leaks
:::
docs/docs/integrations/compose.md (3)

60-66: Enhance the warning message with specific details and alternatives

The warning about MVVM+ style with Compose could be more helpful by:

  1. Explaining how LambdaIntent causes context leaks
  2. Quantifying the performance impact
  3. Providing recommended alternative patterns
 :::warning
-Compose does not play well with MVVM+ style because of the instability of the `LambdaIntent` and `ViewModel` classes.
-It is discouraged to use Lambda intents with Compose as that will not only leak the context of the store but
-also degrade performance, also forcing you to pass tons of function references as parameters.
+Compose has compatibility issues with MVVM+ style due to:
+1. Context leaks: `LambdaIntent` captures and retains the store's context beyond its intended lifecycle
+2. Performance impact: Unstable `ViewModel` classes trigger unnecessary recompositions
+3. Code complexity: Requires passing numerous function references as parameters
+
+**Alternative Pattern:**
+Consider using a pure UI state pattern with `IntentReceiver` as demonstrated in the "Create Pure UI Composables" section below.
 :::
🧰 Tools
🪛 LanguageTool

[style] ~63-~63: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ambda intents with Compose as that will not only leak the context of the store but also degrade performance, also forcing you to pass t...

(NOT_ONLY_ALSO)


[style] ~64-~64: You’ve already used the word ‘also’ once in your sentence, so using it again may be redundant.
Context: ...the store but also degrade performance, also forcing you to pass tons of function references...

(REDUNDANT_FILLER)


104-105: Improve clarity of the smart-casting explanation

The sentence has grammatical issues and could be clearer about the benefits of pure UI composables.

-It will also enable smart-casting by the compiler make UI tests super easy.
+It will also enable smart-casting by the compiler, making UI tests easier to write and maintain.

Line range hint 122-132: Enhance the Intent subclassing example

The example would be more valuable with a complete implementation showing:

  1. How this pattern prevents incorrect state handling
  2. Example of state-specific intents
  3. Usage in a real component
 sealed interface CounterIntent: MVIIntent {
     sealed interface DisplayingCounterIntent: MVIIntent
     sealed interface ErrorIntent : MVIIntent
     sealed interface LoadingIntent : MVIIntent
+    
+    // Example state-specific intents
+    data class IncrementCounter(val amount: Int) : DisplayingCounterIntent
+    data class ShowError(val message: String) : ErrorIntent
+    object StartLoading : LoadingIntent
 }

-// then, use
-IntentReceiver<DisplayingCounterIntent>.DisplayingCounterContent()
+// Usage in a component
+@Composable
+private fun IntentReceiver<CounterIntent.DisplayingCounterIntent>.DisplayingCounterContent(
+    counter: Int
+) {
+    Button(onClick = { intent(IncrementCounter(1)) }) {
+        Text("Counter: $counter")
+    }
+}
🧰 Tools
🪛 LanguageTool

[style] ~121-~121: This phrase is redundant. Consider using “outside”.
Context: ...``` Now this function cannot be called outside of the required store's area of responsibi...

(OUTSIDE_OF)

docs/docs/plugins/debugging.md (1)

9-9: Fix macOS capitalization

According to Apple's branding guidelines, "MacOS" should be "macOS".

-FlowMVI comes with a remote debugging setup with a dedicated Jetbrains IDEs / Android Studio plugin and a desktop app for Windows, Linux, and MacOS.
+FlowMVI comes with a remote debugging setup with a dedicated Jetbrains IDEs / Android Studio plugin and a desktop app for Windows, Linux, and macOS.
🧰 Tools
🪛 LanguageTool

[grammar] ~9-~9: The operating system from Apple is written “macOS”.
Context: ...d a desktop app for Windows, Linux, and MacOS. <iframe width="384px" height="319px" ...

(MAC_OS)

docs/docs/plugins/savedstate.md (2)

74-84: Enhance the Periodic behavior documentation

The Periodic behavior section could be more helpful with additional context and examples.

 ### `Periodic`
 
 Save the state periodically after the specified `delay` regardless of whether the state was updated.
-This is useful when you are updating the state with `updateStateImmediate`, e.g. text fields.
+This is useful in scenarios such as:
+- Form autosave features
+- Text editors with periodic backups
+- Real-time collaboration where state sync is critical
+
+Example configuration:
+```kotlin
+saveState(
+    behaviors = listOf(
+        SaveBehavior.Periodic(
+            delay = 30.seconds,
+            scope = coroutineScope // Provide a scope that matches your component's lifecycle
+        )
+    )
+)
+```
+
+:::tip
+Choose appropriate delays based on:
+- User interaction frequency
+- Data importance
+- Performance requirements
+:::

 :::info
 By default, `OnChange` and `OnUnsubscribe` are used - on each change, with a sensible delay, and when all subscribers leave.
 You can customize this via the `behaviors` parameter of the plugin.
 :::

Line range hint 154-162: Add implementation examples for handling app updates

The app updates section would be more helpful with concrete implementation examples.

 The best way to solve this would be to clear the saved state (for example, by deleting the directory) on each app
 update.
 
 You can do this by registering a broadcast receiver or checking if the app was updated upon startup.
-Implementation of this logic is out of scope of the library.
+
+Example implementation:
+```kotlin
+class AppUpdateHandler(
+    private val context: Context,
+    private val prefs: SharedPreferences
+) {
+    fun checkForUpdate() {
+        val currentVersion = context.packageManager
+            .getPackageInfo(context.packageName, 0)
+            .longVersionCode
+        val savedVersion = prefs.getLong("last_version", -1)
+        
+        if (savedVersion != currentVersion) {
+            // Clear saved state
+            context.cacheDir.resolve("saved_state").deleteRecursively()
+            // Update saved version
+            prefs.edit().putLong("last_version", currentVersion).apply()
+        }
+    }
+}
+```
+
+:::tip
+Consider using semantic versioning to determine if state clearing is necessary based on breaking changes.
+:::
docs/docs/plugins/decorators.md (3)

8-14: Enhance the experimental feature warning

Consider adding more emphasis to the experimental nature of decorators by:

  1. Adding a clear version number when this feature was introduced
  2. Explicitly stating the potential risks of using experimental features in production
 :::warning[Experimental Feature]

-Decorators are currently experimental because their DSL is limited by Kotlin features and they
-are less safe/performant to use. There will be a breaking change with them within a few updates.
-They are also not tested enough as of 3.1 Beta releases.
+⚠️ EXPERIMENTAL FEATURE (Since v3.1 Beta)
+
+Decorators are currently experimental and NOT recommended for production use because:
+- Their DSL is limited by Kotlin features
+- They are less safe/performant compared to regular plugins
+- Breaking changes are expected within the next few updates
+- Test coverage is limited
+
+Use at your own risk in production environments.
🧰 Tools
🪛 LanguageTool

[uncategorized] ~10-~10: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... their DSL is limited by Kotlin features and they are less safe/performant to use. T...

(COMMA_COMPOUND_SENTENCE)


56-62: Clarify the chain parameter warning

The current info block about the chain parameter could be more explicit about the implications and best practices.

 :::info

-The `chain` parameter is temporary and will become a receiver with a future Kotlin release. Right now,
-calling the chain is awkward because you have to always wrap it in a `run` block to bring the `PipelineContext` into
-the scope.
+The `chain` parameter is temporary and will be replaced with a receiver in a future Kotlin release.
+
+Current limitations:
+- Must wrap chain calls in a `run` block to access PipelineContext
+- Syntax is more verbose than ideal
+
+Example:
+```kotlin
+chain.run { onIntent(intent) } // Current syntax
+// Future syntax (planned):
+chain.onIntent(intent)
+```
🧰 Tools
🪛 LanguageTool

[style] ~58-~58: For conciseness, consider replacing this expression with an adverb.
Context: ... receiver with a future Kotlin release. Right now, calling the chain is awkward because y...

(AT_THE_MOMENT)


195-199: Remove non-essential info block

The info block about word count, while humorous, doesn't provide valuable information to users. Consider removing it to maintain professional and focused documentation.

docs/docs/misc/FAQ.md (2)

5-6: Add Kotlin/JDK version compatibility information

Consider adding explicit version compatibility information to help users understand requirements better.

-The library's minimum JVM target is set to 11 (sadly still not the default in Gradle).
+The library's minimum JVM target is set to 11 (as of version X.Y.Z).
+
+Compatibility:
+- Kotlin: 1.8.0 or higher recommended
+- JDK: 11 or higher required
+- Gradle: 7.0 or higher recommended

1-4: Fix markdown structure issues

The document has several markdown structural issues that should be addressed:

  1. Heading levels should increment by one level at a time
  2. Code blocks should specify language
-# FAQ
+# FAQ
+
+## JVM Configuration
 
-### "Cannot inline bytecode" error
+### "Cannot inline bytecode" error
🧰 Tools
🪛 Markdownlint (0.37.0)

3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)

docs/docs/plugins/custom.md (1)

97-102: Add explicit failure scenarios to plugin installation warning

The warning about plugin installation could benefit from more explicit failure scenarios and error messages.

 :::warning

-If you attempt to install the same plugin multiple times, or different plugins
-with the same name, **an exception will be thrown**.
+If you attempt to install the same plugin multiple times, or different plugins
+with the same name, an `IllegalArgumentException` will be thrown with one of these messages:
+
+- "Plugin 'name' is already installed"
+- "Another plugin with name 'name' is already installed"
+
+These errors are thrown during store initialization to prevent runtime conflicts.
docs/docs/plugins/prebuilt.md (3)

15-15: Add alt text to the image for accessibility.

The image showing the plugin chain workflow should include alt text for better accessibility.

-![](/chart.png)
+![Plugin Chain Workflow Diagram](/chart.png)
🧰 Tools
🪛 Markdownlint (0.37.0)

15-15: null
Images should have alternate text (alt text)

(MD045, no-alt-text)


557-563: Enhance the Deinit plugin documentation.

The documentation for the Deinit plugin could be more descriptive. Consider adding:

  • Common use cases
  • Example scenarios
  • Interaction with other plugins

564-577: Improve Reset State plugin documentation.

The Reset State plugin documentation could benefit from:

  • Explanation of when to use this plugin vs manual state management
  • Warning about potential side effects of resetting state
  • Example showing interaction with other plugins
docs/docs/quickstart.md (3)

367-387: Fix heading hierarchy for consistency.

The "Automatically:" and "Manually" sections should use consistent heading levels. Consider using h3 (###) for both sections to maintain proper document hierarchy.

🧰 Tools
🪛 Markdownlint (0.37.0)

367-367: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time

(MD001, heading-increment)


367-367: Punctuation: ':'
Trailing punctuation in heading

(MD026, no-trailing-punctuation)


169-173: Enhance the Contract section with examples.

The Contract section could benefit from:

  • Example of what makes a class "immutable and comparable"
  • Code example showing incorrect vs correct implementation
  • Link to Kotlin documentation about data classes and equals/hashCode
🧰 Tools
🪛 LanguageTool

[style] ~172-~172: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...te` object provided by the library. - If your store does not have side effects, ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[misspelling] ~172-~172: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... effects, use Nothing in place of the side-effect type.

Click if you ...

(AFFECT_EFFECT)


20-20: Use consistent terminology for side effects.

The documentation uses both "side-effects" and "side effects". Standardize the terminology throughout the documentation for consistency.

-side-effects
+side effects

Also applies to: 184-186

🧰 Tools
🪛 LanguageTool

[misspelling] ~20-~20: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... render their State and consume side-effects, called Actions. - States, Intent...

(AFFECT_EFFECT)

docs/docs/README.md (1)

3-3: Fix heading hierarchy.

The heading level should be h2 (##) to maintain proper document hierarchy after the h1 title.

-### Stub readme file, do not edit!
+## Stub readme file, do not edit!
🧰 Tools
🪛 Markdownlint (0.37.0)

3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)

README.md (1)

Line range hint 359-374: Update copyright year range

The copyright year extends to 2025, which is beyond the current year. Consider updating it to the current year or removing the end year.

Apply this change:

-   Copyright 2022-2025 Respawn Team and contributors
+   Copyright 2022-2024 Respawn Team and contributors
🧰 Tools
🪛 Markdownlint (0.37.0)

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2d9966c and ea088f7.

⛔ Files ignored due to path filters (36)
  • docs/images/debugger.gif is excluded by !**/*.gif
  • docs/images/icon_512.png is excluded by !**/*.png
  • docs/package-lock.json is excluded by !**/package-lock.json
  • docs/static/apple-touch-icon.png is excluded by !**/*.png
  • docs/static/banner.png is excluded by !**/*.png
  • docs/static/chart.png is excluded by !**/*.png
  • docs/static/debugger_setup_1.png is excluded by !**/*.png
  • docs/static/favicon.ico is excluded by !**/*.ico
  • docs/static/icon-192-maskable.png is excluded by !**/*.png
  • docs/static/icon-192.png is excluded by !**/*.png
  • docs/static/icon-512-maskable.png is excluded by !**/*.png
  • docs/static/icon-512.png is excluded by !**/*.png
  • docs/static/icon.svg is excluded by !**/*.svg
  • docs/static/icon_banner.png is excluded by !**/*.png
  • docs/static/icon_nobg.svg is excluded by !**/*.svg
  • docs/static/ios/AppIcon-20@2x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-20@2x~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-20@3x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-20~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-29.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-29@2x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-29@2x~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-29@3x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-29~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-40@2x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-40@2x~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-40@3x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-40~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-60@2x~car.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-60@3x~car.png is excluded by !**/*.png
  • docs/static/ios/AppIcon-83.5@2x~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon@2x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon@2x~ipad.png is excluded by !**/*.png
  • docs/static/ios/AppIcon@3x.png is excluded by !**/*.png
  • docs/static/ios/AppIcon~ios-marketing.png is excluded by !**/*.png
  • docs/static/ios/AppIcon~ipad.png is excluded by !**/*.png
📒 Files selected for processing (33)
  • .github/workflows/ci.yml (2 hunks)
  • .github/workflows/docs.yml (1 hunks)
  • .gitignore (1 hunks)
  • README.md (1 hunks)
  • buildSrc/src/main/kotlin/dokkaDocumentation.gradle.kts (1 hunks)
  • docs/.gitignore (1 hunks)
  • docs/README.md (0 hunks)
  • docs/_navbar.md (0 hunks)
  • docs/docs/README.md (1 hunks)
  • docs/docs/integrations/_category_.json (1 hunks)
  • docs/docs/integrations/android.md (4 hunks)
  • docs/docs/integrations/compose.md (6 hunks)
  • docs/docs/integrations/essenty.md (5 hunks)
  • docs/docs/misc/CONTRIBUTING.md (1 hunks)
  • docs/docs/misc/FAQ.md (3 hunks)
  • docs/docs/misc/_category_.json (1 hunks)
  • docs/docs/plugins/_category_.json (1 hunks)
  • docs/docs/plugins/custom.md (7 hunks)
  • docs/docs/plugins/debugging.md (10 hunks)
  • docs/docs/plugins/decorators.md (3 hunks)
  • docs/docs/plugins/prebuilt.md (10 hunks)
  • docs/docs/plugins/savedstate.md (5 hunks)
  • docs/docs/quickstart.md (1 hunks)
  • docs/docusaurus.config.ts (1 hunks)
  • docs/index.html (0 hunks)
  • docs/package.json (1 hunks)
  • docs/quickstart.md (0 hunks)
  • docs/sidebars.ts (1 hunks)
  • docs/src/css/custom.css (1 hunks)
  • docs/static/manifest.json (1 hunks)
  • docs/static/robots.txt (1 hunks)
  • docs/sw.js (0 hunks)
  • docs/tsconfig.json (1 hunks)
💤 Files with no reviewable changes (5)
  • docs/README.md
  • docs/_navbar.md
  • docs/index.html
  • docs/quickstart.md
  • docs/sw.js
✅ Files skipped from review due to trivial changes (10)
  • docs/static/robots.txt
  • buildSrc/src/main/kotlin/dokkaDocumentation.gradle.kts
  • docs/sidebars.ts
  • docs/docs/misc/CONTRIBUTING.md
  • docs/static/manifest.json
  • docs/docs/integrations/category.json
  • docs/tsconfig.json
  • docs/.gitignore
  • docs/package.json
  • docs/docs/plugins/category.json
🧰 Additional context used
🪛 LanguageTool
docs/docs/plugins/debugging.md

[grammar] ~9-~9: The operating system from Apple is written “macOS”.
Context: ...d a desktop app for Windows, Linux, and MacOS. <iframe width="384px" height="319px" ...

(MAC_OS)


[uncategorized] ~81-~81: Consider inserting a comma before ‘unfortunately’.
Context: ...t to "notepad-style coding" for that set unfortunately. ::: ### 1.3 Set up store configurati...

(FINAL_ADVERB_COMMA)

docs/docs/integrations/android.md

[uncategorized] ~108-~108: Although a hyphen is possible, it is not necessary in a compound modifier in which the first word is an adverb that ends in ‘ly’.
Context: ... you must inject the VM by specifying a fully-qualified type e.g. `StoreViewModel<CounterState,...

(HYPHENATED_LY_ADVERB_ADJECTIVE)

docs/docs/plugins/prebuilt.md

[uncategorized] ~19-~19: Loose punctuation mark.
Context: ...:::danger[The order of plugins matters! ] Changing the order of plugins may comp...

(UNLIKELY_OPENING_PUNCTUATION)


[style] ~21-~21: Consider using a different adverb to strengthen your wording.
Context: ...s! ] Changing the order of plugins may completely change how your store works. Plugins ca...

(COMPLETELY_ENTIRELY)


[typographical] ~115-~115: Consider adding a comma after ‘Literally’ for more clarity.
Context: ...earn how to set up the environment. * Literally any plugin - just call install { } ...

(RB_LY_COMMA)


[style] ~342-~342: This phrase is redundant. Consider using “outside”.
Context: ...ou must not try to access the value outside of the store's lifecycle, or the attempt...

(OUTSIDE_OF)


[uncategorized] ~461-~461: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...n after they leave, the state will reset and you can call await() again. * Speci...

(COMMA_COMPOUND_SENTENCE)

docs/docs/plugins/savedstate.md

[uncategorized] ~20-~20: Loose punctuation mark.
Context: ...e artifact depends on: - kotlinx-io, and as a consequence, on okio - `ko...

(UNLIKELY_OPENING_PUNCTUATION)


[style] ~35-~35: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...f a particular subtype. - JsonSaver for saving the state as a JSON. - `FileSa...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~36-~36: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ng the state as a JSON. - FileSaver for saving the state to a file. See `Defaul...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

docs/docs/plugins/decorators.md

[uncategorized] ~10-~10: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ... their DSL is limited by Kotlin features and they are less safe/performant to use. T...

(COMMA_COMPOUND_SENTENCE)


[style] ~58-~58: For conciseness, consider replacing this expression with an adverb.
Context: ... receiver with a future Kotlin release. Right now, calling the chain is awkward because y...

(AT_THE_MOMENT)

docs/docs/integrations/compose.md

[style] ~63-~63: Opting for a less wordy alternative here can improve the clarity of your writing.
Context: ...ambda intents with Compose as that will not only leak the context of the store but also degrade performance, also forcing you to pass t...

(NOT_ONLY_ALSO)


[style] ~64-~64: You’ve already used the word ‘also’ once in your sentence, so using it again may be redundant.
Context: ...the store but also degrade performance, also forcing you to pass tons of function references...

(REDUNDANT_FILLER)

docs/docs/quickstart.md

[uncategorized] ~11-~11: Use a comma before ‘and’ if it connects two independent clauses (unless they are closely connected and short).
Context: ...learn everything you need to get started and we'll build a feature with UI in 10 min...

(COMMA_COMPOUND_SENTENCE)


[style] ~14-~14: Often, this adverbial phrase is redundant. Consider using an alternative.
Context: ...tep 0: Understand the primary concepts First of all, here's how the library works: - **S...

(FIRST_OF_ALL)


[misspelling] ~20-~20: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... render their State and consume side-effects, called Actions. - States, Intent...

(AFFECT_EFFECT)


[style] ~172-~172: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...te` object provided by the library. - If your store does not have side effects, ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[misspelling] ~172-~172: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... effects, use Nothing in place of the side-effect type.

Click if you ...

(AFFECT_EFFECT)


[style] ~180-~180: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...n the page be empty? Can it be loading? Can errors happen? - this will define yo...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[misspelling] ~184-~184: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... - these are Actions. Keep in mind that side-effects are not the best way to manage your ...

(AFFECT_EFFECT)


[misspelling] ~186-~186: Did you mean “side effects” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... logic stateful first, and resort to side-effects only if a third-party API you're workin...

(AFFECT_EFFECT)


[style] ~200-~200: As a shorter alternative for ‘able to’, consider using “can”.
Context: ...er using state instead of events if you are able to always know the outcome. [Read ...

(BE_ABLE_TO)


[style] ~242-~242: The phrase ‘a lot of’ might be wordy and overused. Consider using an alternative.
Context: ...the debuggable parameter - it enables a lot of additional features like logging and va...

(A_LOT_OF)


[style] ~260-~260: Consider removing “of” to be more concise
Context: ...n of the properties

Here are all of the configurable settings with defaults ass...

(ALL_OF_THE)


[style] ~347-~347: Try using a synonym here to strengthen your writing.
Context: ...an "environment" the Store runs in, and gives you access to everything you need: - `up...

(GIVE_PROVIDE)


[misspelling] ~351-~351: Did you mean “side effect” (=adverse effect, unintended consequence)? Open compounds are not hyphenated.
Context: ... not change it. - action() - send a side-effect to subscribers - intent() - re-send...

(AFFECT_EFFECT)


[style] ~365-~365: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...can use rememberCoroutineScope(). - On iOS, provide a scope manually or throug...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 Markdownlint (0.37.0)
docs/docs/plugins/prebuilt.md

15-15: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

docs/docs/quickstart.md

367-367: Expected: h3; Actual: h4
Heading levels should only increment by one level at a time

(MD001, heading-increment)


18-18: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


190-190: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


195-195: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


199-199: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


200-200: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


202-202: Expected: 4; Actual: 8
Unordered list indentation

(MD007, ul-indent)


203-203: Expected: 4; Actual: 8
Unordered list indentation

(MD007, ul-indent)


204-204: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


205-205: Expected: 4; Actual: 8
Unordered list indentation

(MD007, ul-indent)


286-286: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


287-287: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


289-289: Expected: 4; Actual: 8
Unordered list indentation

(MD007, ul-indent)


291-291: Expected: 4; Actual: 8
Unordered list indentation

(MD007, ul-indent)


293-293: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


294-294: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


297-297: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


301-301: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


302-302: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


303-303: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


304-304: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


305-305: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


307-307: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


311-311: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


314-314: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


321-321: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


322-322: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)


102-102: Punctuation: ':'
Trailing punctuation in heading

(MD026, no-trailing-punctuation)


111-111: Punctuation: ':'
Trailing punctuation in heading

(MD026, no-trailing-punctuation)


367-367: Punctuation: ':'
Trailing punctuation in heading

(MD026, no-trailing-punctuation)

docs/docs/misc/FAQ.md

3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)


8-8: null
Fenced code blocks should have a language specified

(MD040, fenced-code-language)


64-64: Expected: 2; Actual: 4
Unordered list indentation

(MD007, ul-indent)

README.md

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

docs/docs/README.md

3-3: Expected: h2; Actual: h3
Heading levels should only increment by one level at a time

(MD001, heading-increment)

🔇 Additional comments (19)
docs/docs/misc/_category_.json (1)

1-6: LGTM! Valid Docusaurus category configuration.

The JSON configuration follows Docusaurus conventions with appropriate properties for category organization.

docs/docusaurus.config.ts (7)

1-3: Ensure minimal imports for performance.
You are importing from prism-react-renderer and @docusaurus/types right at the top. This is generally fine, but if you notice build performance issues, consider lazy-loading or splitting certain imports to optimize.


7-20: Good initial config defaults.
The fundamental setup (title, tagline, base URLs, etc.) looks solid for a typical Docusaurus project. The strict settings (e.g., onBrokenLinks: 'throw') are beneficial to catch broken references early.


43-44: Confirm analytics tracking ID security.
You have a Google Analytics tracking ID (G-NRB9ZFKNGN) checked into version control. In most cases, this is acceptable, but it’s worth verifying whether any additional usage data or environment-specific configurations need to remain private.


70-96: Navbar configuration looks comprehensive.
Including a link to your GitHub repository is an excellent way to foster contributions. Ensure that the label: undefined for the GitHub link is intentional, since it might display an empty text or rely solely on the icon.


98-125: Syntax highlighting configuration is well-structured.
You've included a robust list of additional languages (e.g., java, kotlin, bash) and defined magicComments for highlighting. This should facilitate a high-quality developer documentation experience.


127-159: Offline functionality provided by the PWA plugin is beneficial.
The pwaHead configuration covers icons, manifest, and theme color. Ensure you have the correct files (e.g., /img/icon.svg, /img/apple-touch-icon.png) in place to avoid broken references at runtime.


162-162: Export statement finalizes the config.
No issues found here. Good usage of TypeScript’s explicit type annotation.

.github/workflows/ci.yml (3)

31-36: Node setup is adequate but consider version stability.
Node.js version 23 is specified. If you want a more stable baseline, you may pin to a current LTS. Otherwise, ensure your teams and integrations are ready for this relatively new version.


63-65: Installing docs dependencies.
This step correctly installs Yarn dependencies under docs. If new dependencies are introduced, remember to update the dependency lockfile to avoid build-time inconsistencies.


69-71: Gradle build step sequencing.
The build step follows after the docs build, which guarantees that the compiled docs don’t break your overall build pipeline. This arrangement is well-structured.

.github/workflows/docs.yml (4)

51-55: Node setup is consistent with other workflows.
Using actions/setup-node@v4 with Yarn caching speeds up the process. Revisit the Node.js version if you want an LTS release or have a pinned version policy.


56-58: Installing dependencies under frozen lockfile.
Great practice to ensure reproducibility of builds. If you ever need to update dependencies, ensure the lockfile is properly regenerated and committed.


60-61: README copy command.
Copying the top-level README.md into ./docs/docs/README.md might be important for uniform docs integration. Confirm that the subdirectory reference is correct to avoid confusion.


69-72: Updated paths for javadocs, sample app, and pages artifact.
The new structure under ./docs/build/ is organized and consistent with the rest of the changes. Just verify all references in your doc pages remain correct (e.g., linking to Javadocs or the sample app).

Also applies to: 78-78, 86-86

.gitignore (1)

169-169: New javadocs ignore path.
You’re ignoring docs/javadocs/**. Make sure any relevant docs outputs from Gradle or other tools are still properly tracked if needed.

README.md (3)

Line range hint 52-89: LGTM! Well-structured feature descriptions

The feature list is comprehensive, well-organized, and effectively communicates the library's value propositions.

🧰 Tools
🪛 Markdownlint (0.37.0)

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)


Line range hint 91-279: LGTM! Clear and comprehensive code examples

The code examples effectively demonstrate the library's key features and are well-documented.

🧰 Tools
🪛 Markdownlint (0.37.0)

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)


Line range hint 19-22: Verify documentation links with new website structure

Since this PR introduces a new documentation website, let's verify these documentation links are updated and working:

  • Documentation link: https://opensource.respawn.pro/FlowMVI/#/
  • KDoc link: https://opensource.respawn.pro/FlowMVI/javadocs/index.html
  • Sample App link: https://opensource.respawn.pro/FlowMVI/sample/
✅ Verification successful

Documentation links are working correctly

All documentation links in the README.md are accessible and working as expected:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check if documentation links are accessible
for url in \
    "https://opensource.respawn.pro/FlowMVI/#/" \
    "https://opensource.respawn.pro/FlowMVI/javadocs/index.html" \
    "https://opensource.respawn.pro/FlowMVI/sample/"; do
    if curl --output /dev/null --silent --head --fail "$url"; then
        echo "✅ URL is accessible: $url"
    else
        echo "❌ URL is not accessible: $url"
    fi
done

Length of output: 1244

🧰 Tools
🪛 Markdownlint (0.37.0)

1-1: null
Images should have alternate text (alt text)

(MD045, no-alt-text)

docs/docs/misc/_category_.json Outdated Show resolved Hide resolved
docs/docs/plugins/debugging.md Show resolved Hide resolved
docs/docs/plugins/custom.md Show resolved Hide resolved
README.md Outdated Show resolved Hide resolved
coderabbitai[bot]
coderabbitai bot previously approved these changes Dec 25, 2024
@Nek-12 Nek-12 merged commit bf0bed1 into master Dec 25, 2024
3 checks passed
@Nek-12 Nek-12 deleted the new-documentation branch December 25, 2024 15:51
@coderabbitai coderabbitai bot mentioned this pull request Dec 31, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant