Giter Site home page Giter Site logo

mohamedrejeb / calf Goto Github PK

View Code? Open in Web Editor NEW
704.0 8.0 30.0 5.98 MB

Calf is a library that allows you to easily create adaptive UIs and access platform specific APIs with Compose Multiplatform (Adaptive UI, File Picker, WebView, Permissions...).

Home Page: https://mohamedrejeb.github.io/Calf/

License: Apache License 2.0

Kotlin 99.94% Shell 0.06%
android compose compose-desktop compose-ios compose-multiplatform compose-ui desktop ios jetpack-compose kotlin

calf's Introduction

Calf - Compose Adaptive Look & Feel

Calf is a library that allows you to easily create adaptive UIs and access platform specific APIs from your Compose Multiplatform apps.

Kotlin Kotlin MohamedRejeb Apache-2.0 BuildPassing Maven Central

Calf thumbnail

Calf stands for Compose Adaptive Look & Feel

Artifacts

Artifact Description Platforms Version
calf-ui Adaptive UI components Android, iOS, Desktop, Web(Js, Wasm) Maven Central
calf-file-picker Native File Picker wrapper Android, iOS, Desktop, Web(Js, Wasm) Maven Central
calf-webview WebView component Android, iOS, Desktop Maven Central
calf-permissions API that allows you to handle permissions Android, iOS Maven Central
calf-geo API that allows you to access geolocation Coming soon... 🚧 🚧 Coming soon... 🚧 🚧
calf-navigation Native navigation wrapper Coming soon... 🚧 🚧 Coming soon... 🚧 🚧
calf-map Native Maps wrapper Coming soon... 🚧 🚧 Coming soon... 🚧 🚧
calf-media Video/Audio player Coming soon... 🚧 🚧 Coming soon... 🚧 🚧
calf-notification Notification manager Coming soon... 🚧 🚧 Coming soon... 🚧 🚧
calf-sf-symbols Apple SF Symbols icons Coming soon... 🚧 🚧 Coming soon... 🚧 🚧

The main focus for now is Android and iOS, but more Desktop components are coming that allows you to create adaptive UIs for Desktop as well (Windows, macOS, Linux)

Web Demo

You can try the web demo here

Compatibility

Maven Central

Kotlin version Compose version Calf version
2.0.0 1.6.11 0.5.1
1.9.22 1.6.0 0.4.1
1.9.21 1.5.11 0.3.1
1.9.20 1.5.10 0.2.0
1.9.0 1.5.0 0.1.1

Documentation

For more information, check the documentation:

Contribution

If you've found an error in this sample, please file an issue.
Feel free to help out by sending a pull request ❀️.

Code of Conduct

Find this library useful? ❀️

Support it by joining stargazers for this repository. ⭐
Also, follow me on GitHub for more libraries! 🀩

You can always

License

Copyright 2023 Mohamed Rejeb

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

calf's People

Contributors

bmc08gt avatar iruizmar avatar j-roskopf avatar jershell avatar joe3112 avatar mohamedrejeb avatar onseok avatar shahriyar13 avatar zeeshanali-k avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

calf's Issues

When update to version 0.2.0

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':shared:transformIosMainCInteropDependenciesMetadataForIde'.
> Could not resolve all task dependencies for configuration ':shared:iosMainResolvableDependenciesMetadata'.
   > Could not find com.mohamedrejeb.calf:calf-io:0.2.0.
     Required by:
         project :shared > com.mohamedrejeb.calf:calf-file-picker:0.2.0

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
org.gradle.api.internal.tasks.TaskDependencyResolveException: Could not determine the dependencies of task ':shared:transformIosMainCInteropDependenciesMetadataForIde'.
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:68)
	at org.gradle.execution.plan.TaskDependencyResolver.resolveDependenciesFor(TaskDependencyResolver.java:49)
	at org.gradle.execution.plan.LocalTaskNode.getDependencies(LocalTaskNode.java:147)
	at org.gradle.execution.plan.LocalTaskNode.resolveDependencies(LocalTaskNode.java:121)
	at org.gradle.execution.plan.DefaultExecutionPlan.discoverNodeRelationships(DefaultExecutionPlan.java:184)
	at org.gradle.execution.plan.DefaultExecutionPlan.doAddEntryNodes(DefaultExecutionPlan.java:156)
	at org.gradle.execution.plan.DefaultExecutionPlan.addEntryTasks(DefaultExecutionPlan.java:131)
	at org.gradle.execution.plan.DefaultExecutionPlan.addEntryTasks(DefaultExecutionPlan.java:123)
	at org.gradle.execution.TaskNameResolvingBuildTaskScheduler.scheduleRequestedTasks(TaskNameResolvingBuildTaskScheduler.java:53)
	at org.gradle.execution.DefaultTasksBuildTaskScheduler.scheduleRequestedTasks(DefaultTasksBuildTaskScheduler.java:72)
	at org.gradle.initialization.DefaultTaskExecutionPreparer.lambda$scheduleRequestedTasks$0(DefaultTaskExecutionPreparer.java:46)
	at org.gradle.internal.Factories$1.create(Factories.java:31)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:345)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$DefaultBuildProjectRegistry.withMutableStateOfAllProjects(DefaultProjectStateRegistry.java:227)
	at org.gradle.api.internal.project.DefaultProjectStateRegistry$DefaultBuildProjectRegistry.withMutableStateOfAllProjects(DefaultProjectStateRegistry.java:220)
	at org.gradle.initialization.DefaultTaskExecutionPreparer.scheduleRequestedTasks(DefaultTaskExecutionPreparer.java:45)
	at org.gradle.initialization.VintageBuildModelController.lambda$scheduleRequestedTasks$0(VintageBuildModelController.java:76)
	at org.gradle.internal.model.StateTransitionController.lambda$inState$2(StateTransitionController.java:121)
	at org.gradle.internal.model.StateTransitionController.lambda$inState$3(StateTransitionController.java:136)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.inState(StateTransitionController.java:132)
	at org.gradle.internal.model.StateTransitionController.inState(StateTransitionController.java:120)
	at org.gradle.initialization.VintageBuildModelController.scheduleRequestedTasks(VintageBuildModelController.java:76)
	at org.gradle.internal.build.DefaultBuildLifecycleController$DefaultWorkGraphBuilder.addRequestedTasks(DefaultBuildLifecycleController.java:260)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.lambda$scheduleRequestedTasks$0(DefaultBuildTreeWorkPreparer.java:38)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$populateWorkGraph$4(DefaultBuildLifecycleController.java:148)
	at org.gradle.internal.build.DefaultBuildWorkPreparer.populateWorkGraph(DefaultBuildWorkPreparer.java:42)
	at org.gradle.internal.build.BuildOperationFiringBuildWorkPreparer$PopulateWorkGraph.populateTaskGraph(BuildOperationFiringBuildWorkPreparer.java:120)
	at org.gradle.internal.build.BuildOperationFiringBuildWorkPreparer$PopulateWorkGraph.run(BuildOperationFiringBuildWorkPreparer.java:91)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.internal.build.BuildOperationFiringBuildWorkPreparer.populateWorkGraph(BuildOperationFiringBuildWorkPreparer.java:68)
	at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$populateWorkGraph$5(DefaultBuildLifecycleController.java:148)
	at org.gradle.internal.model.StateTransitionController.lambda$inState$2(StateTransitionController.java:121)
	at org.gradle.internal.model.StateTransitionController.lambda$inState$3(StateTransitionController.java:136)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.inState(StateTransitionController.java:132)
	at org.gradle.internal.model.StateTransitionController.inState(StateTransitionController.java:120)
	at org.gradle.internal.build.DefaultBuildLifecycleController.populateWorkGraph(DefaultBuildLifecycleController.java:148)
	at org.gradle.internal.build.DefaultBuildWorkGraphController$DefaultBuildWorkGraph.populateWorkGraph(DefaultBuildWorkGraphController.java:167)
	at org.gradle.composite.internal.DefaultBuildController.populateWorkGraph(DefaultBuildController.java:73)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph$DefaultBuildTreeWorkGraphBuilder.withWorkGraph(DefaultIncludedBuildTaskGraph.java:150)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.lambda$scheduleRequestedTasks$1(DefaultBuildTreeWorkPreparer.java:38)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph$DefaultBuildTreeWorkGraph$1.run(DefaultIncludedBuildTaskGraph.java:197)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph$DefaultBuildTreeWorkGraph.scheduleWork(DefaultIncludedBuildTaskGraph.java:192)
	at org.gradle.internal.buildtree.DefaultBuildTreeWorkPreparer.scheduleRequestedTasks(DefaultBuildTreeWorkPreparer.java:37)
	at org.gradle.configurationcache.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:36)
	at org.gradle.configurationcache.VintageBuildTreeWorkController$scheduleAndRunRequestedTasks$1.apply(VintageBuildTreeWorkController.kt:35)
	at org.gradle.composite.internal.DefaultIncludedBuildTaskGraph.withNewWorkGraph(DefaultIncludedBuildTaskGraph.java:109)
	at org.gradle.configurationcache.VintageBuildTreeWorkController.scheduleAndRunRequestedTasks(VintageBuildTreeWorkController.kt:35)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$fromBuildModel$2(DefaultBuildTreeLifecycleController.java:76)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:98)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:177)
	at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:258)
	at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:177)
	at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:44)
	at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:177)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:95)
	at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.fromBuildModel(DefaultBuildTreeLifecycleController.java:73)
	at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:43)
	at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:53)
	at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
	at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49)
	at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:65)
	at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:140)
	at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:122)
	at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:40)
	at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:53)
	at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:65)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:61)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$3.call(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
	at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:57)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:249)
	at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:109)
	at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36)
	at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110)
	at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64)
	at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:100)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter$ActionImpl.apply(BuildSessionLifecycleBuildActionExecuter.java:88)
	at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:69)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:62)
	at org.gradle.tooling.internal.provider.BuildSessionLifecycleBuildActionExecuter.execute(BuildSessionLifecycleBuildActionExecuter.java:41)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:63)
	at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:50)
	at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:38)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:47)
	at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:31)
	at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:65)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:78)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.create(ForwardClientInput.java:75)
	at org.gradle.util.internal.Swapper.swap(Swapper.java:38)
	at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:75)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:64)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84)
	at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37)
	at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
	at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52)
	at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:49)
Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all task dependencies for configuration ':shared:iosMainResolvableDependenciesMetadata'.
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.mapFailure(DefaultConfiguration.java:1595)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$3900(DefaultConfiguration.java:166)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$DefaultResolutionHost.mapFailure(DefaultConfiguration.java:2278)
	at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationFileCollection.visitDependencies(DefaultConfiguration.java:1549)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:103)
	at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmptyEdges.getNodeValues(CachingDirectedGraphWalker.java:213)
	at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:121)
	at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:73)
	at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:66)
	... 141 more
Caused by: org.gradle.internal.resolve.ModuleVersionNotFoundException: Could not find com.mohamedrejeb.calf:calf-io:0.2.0.
Required by:
    project :shared > com.mohamedrejeb.calf:calf-file-picker:0.2.0


* Get more help at https://help.gradle.org

BUILD FAILED in 10s

Android minSdk 21

Hi, would it be possible to lower the Android minSdk version to 21 from 24? Is there anything preventing such a change?

Temporary file breaks stored directory opening on iOS.

The change introduced by 0.4.1 after 0.4.0 breaks the following use case:

  • I open a file
  • Show the file name and a button to open the containing directory
  • Open the directory with the button.
      val url: NSURL = NSURL.URLWithString("shareddocuments://$folder")?: return
      val canOpenUrl = UIApplication.sharedApplication.canOpenURL(url)
      if (canOpenUrl) {
          UIApplication.sharedApplication.openURL(url)
      }

Expected behaviour (0.4.0):

  • The filename is real.
  • The folder contains the file.
image image

Actual behaviour:

  • Fake filename.
  • Opens non-existing folder.
image image

Support select folder ?

I found that there is no kmp file picker that supports selecting folders, can you support it ?

WebView with Adaptive Sheet presentation bug

When replacing the modalpresentationstyle of the bottomsheetUiViewController from popover to formsheet and using the following detents:

bottomSheetUIViewController.modalPresentationStyle = UIModalPresentationFormSheet
bottomSheetUIViewController.sheetPresentationController?.setDetents(
            listOf(
                UISheetPresentationControllerDetent.mediumDetent(),
                UISheetPresentationControllerDetent.largeDetent(),
            ),
        )

and placing a WebView inside the sheet, dragging the sheet from the medium to the large detent causes a weird flickering of the webview from the bottom [as if it were continuously resizing].

Bottom Sheet recomposes entire content If its slightly dragged without fully dismissing

In the Adaptive Bottom Sheet specifically the iOS implementation, placing any content inside the sheet causes the content to recompose if I slightly drag the sheet downwards and let it snap back to its original height without dismissing it. What I did exactly was I used the Adaptive Bottom Sheet in my iOS module and placed a WebView inside it [also from calf]. dragging the sheet and letting it go back to its original height recomposes the webview inside which causes my webview to reload.
Here's a small code snippet:

AdaptiveBottomSheet(
                    onDismissRequest = {  },
                    adaptiveSheetState =
                        rememberAdaptiveSheetState(),
                ) {
                    WebView(
                        state = state,
                    )
                }

Does WebView Allow Ajax Requests

I was googling around and found
val settings: WebSettings = webview.getSettings(); settings.setJavaScriptEnabled(true); settings.setDomStorageEnabled(true);

I wonder if this is already enabled on Calf Webview?
I get a blank page with this link which has a lot of xhr/ajax
https://sign.zoho.com/zsguest?locale=en&sign_id=234b4d535f495623eec545575b5ff767ae2cc1e50a5a4796a2cc40020ee8d185a971f31d96a1fb6037de65f4cce9f392ee2b84979ecb3fbcc65fbd768ffb4e13b63f8686a679e74500c52b2c1c7ee71e6994e5ae3aea726b35e4e8349d52292309d6563503131e960c9cce171f03a00ce0dce08c895ca6f37114f8a37c301a5dcd471d8269730db4&frameorigin=https://presta.co.ke

PHPicker crashes on iOS < 15

createPHPickerViewController calls setter functions on PHPickerConfiguration that is isn't available below iOS 15.

The ones I managed to dig out from Apple's documentation are

  • selection
  • preselectedAssetIdentifiers

Was that intentional or should I submit a PR for a fix?

getting this error when uploading pdf

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1020266550, result=-1, data=Intent { dat=content://com.android.providers.downloads.documents/document/raw:/storage/emulated/0/Download/ncert.pdf flg=0x1 }} to activity {xyz.penpencil.unigo/com.myapplication.MainActivity}: java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/ncert.pdf"
at android.app.ActivityThread.deliverResults(ActivityThread.java:5340)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:5379)
at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:67)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2252)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7842)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
Caused by: java.lang.NumberFormatException: For input string: "raw:/storage/emulated/0/Download/ncert.pdf"
at java.lang.Long.parseLong(Long.java:594)
at java.lang.Long.valueOf(Long.java:808)
at com.mohamedrejeb.calf.picker.URIPathHelper.getPath(UriHelper.kt:30)
at com.mohamedrejeb.calf.picker.FilePickerLauncher_androidKt$pickSingleFile$singlePhotoPickerLauncher$1.invoke(FilePickerLauncher.android.kt:138)
at com.mohamedrejeb.calf.picker.FilePickerLauncher_androidKt$pickSingleFile$singlePhotoPickerLauncher$1.invoke(FilePickerLauncher.android.kt:135)
at androidx.activity.compose.ActivityResultRegistryKt$rememberLauncherForActivityResult$1.invoke$lambda$0(ActivityResultRegistry.kt:106)
at androidx.activity.compose.ActivityResultRegistryKt$rememberLauncherForActivityResult$1.$r8$lambda$CrhP0xb3HsgP_dLwJEFAtzTwPms(Unknown Source:0)
at androidx.activity.compose.ActivityResultRegistryKt$rememberLauncherForActivityResult$1$$ExternalSyntheticLambda0.onActivityResult(Unknown Source:2)
at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:414)
at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:371)
at androidx.activity.ComponentActivity.onActivityResult(ComponentActivity.java:845)
at androidx.fragment.app.FragmentActivity.onActivityResult(FragmentActivity.java:152)
at android.app.Activity.dispatchActivityResult(Activity.java:8385)
at android.app.ActivityThread.deliverResults(ActivityThread.java:5333)

File Picker Opening Recents Screen in iOS

File Picker is opening the Recents Screen in iOS, unlike the gallery screen as shown in the Repository Readme.

Source Code

val imageLauncher = rememberFilePickerLauncher(
    type = FilePickerFileType.Image,
    selectionMode = FilePickerSelectionMode.Single,
) {
   //handling response
}

Screen which is being Opened

Screenshot 2023-10-26 at 6 33 30β€―PM

Screen which should be Opened

image

Zoom in/out in browser

Zooming in/out in browser: experiencing bug. View stays the same, mouse focuses wrong items.

Add Permissions Support

  • Android
  • iOS
  • Web

AFAIK permissions are handled automatically in Desktop so we don't need to worry about it.

Indefinite Freeze on FilePicker launch

MacOS 14.5 (23F79)
M2 Max
calf-file-picker = "0.4.0"

   val pickerLauncher = rememberFilePickerLauncher(
        type = mimeType,
        selectionMode = FilePickerSelectionMode.Single,
        onResult = { files ->
            coroutineScope.launch {
                files.firstOrNull()?.let { file ->
                    // Do something with the selected file
                    // You can get the ByteArray of the file
                    println(file.getPath(context))
//                        file.readByteArray(context)
                }
            }
        }
    )

On a button click I do pickerLauncher.launch().

The app does not show any error, just freezes.

On iOS and Android everything works as expected.

Problem with JavaFX

I ran it by macosX64 as a JVM desktop app

When I add calf-ui package, I got the following error:

Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found

Dec 08, 2023 10:12:18 AM com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @82702de'
Graphics Device initialization failed for :  es2, sw
Error initializing QuantumRenderer: no suitable pipeline found
java.lang.RuntimeException: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
	at com.sun.javafx.tk.quantum.QuantumRenderer.getInstance(QuantumRenderer.java:283)
	at com.sun.javafx.tk.quantum.QuantumToolkit.init(QuantumToolkit.java:253)
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:268)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
	at javafx.application.Platform.startup(Platform.java:113)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at kotlinx.coroutines.javafx.PlatformInitializer.<clinit>(JavaFxDispatcher.kt:132)
	at kotlinx.coroutines.javafx.JavaFxDispatcherKt.initPlatform(JavaFxDispatcher.kt:115)
	at kotlinx.coroutines.javafx.JavaFx.<clinit>(JavaFxDispatcher.kt:77)
	at kotlinx.coroutines.javafx.JavaFxDispatcherFactory.createDispatcher(JavaFxDispatcher.kt:56)
	at kotlinx.coroutines.internal.MainDispatchersKt.tryCreateDispatcher(MainDispatchers.kt:57)
	at kotlinx.coroutines.internal.MainDispatcherLoader.loadMainDispatcher(MainDispatchers.kt:38)
	at kotlinx.coroutines.internal.MainDispatcherLoader.<clinit>(MainDispatchers.kt:22)
	at kotlinx.coroutines.Dispatchers.getMain(Dispatchers.kt:24)
	at app.duss.easyproject.core.utils.AppDispatchersKt$appDispatchers$1.<init>(AppDispatchers.kt:7)
	at app.duss.easyproject.core.utils.AppDispatchersKt.<clinit>(AppDispatchers.kt:6)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.<init>(MainStoreFactory.kt:38)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at com.arkivanov.mvikotlin.main.store.DefaultStoreFactory.create(DefaultStoreFactory.kt:26)
	at com.arkivanov.mvikotlin.core.store.StoreFactory$DefaultImpls.create$default(StoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1.<init>(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory.create(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:66)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:63)
	at com.arkivanov.mvikotlin.core.instancekeeper.InstanceKeeperExtKt.getStore(InstanceKeeperExt.kt:9)
	at app.duss.easyproject.presentation.ui.root.RootComponent.<init>(RootComponent.kt:144)
	at MainKt$main$rootComponent$1.invoke(Main.kt:32)
	at MainKt$main$rootComponent$1.invoke(Main.kt:17)
	at MainKt.invokeOnAwtSync$lambda$0(Main.kt:56)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:308)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
	at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.init(QuantumRenderer.java:95)
	at com.sun.javafx.tk.quantum.QuantumRenderer$PipelineRunnable.run(QuantumRenderer.java:125)
	at java.base/java.lang.Thread.run(Thread.java:1583)
Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize
	at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:115)
	at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:96)
	at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:319)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
	at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
	at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.getLoggedInUser(MainStoreFactory.kt:54)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.executeAction(MainStoreFactory.kt:40)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.executeAction(MainStoreFactory.kt:37)
	at com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor.executeAction(CoroutineExecutor.kt:54)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$3.invoke(DefaultStore.kt:65)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$3.invoke(DefaultStore.kt:61)
	at com.arkivanov.mvikotlin.core.store.SimpleBootstrapper.invoke(SimpleBootstrapper.kt:28)
	at com.arkivanov.mvikotlin.main.store.DefaultStore.init(DefaultStore.kt:69)
	at com.arkivanov.mvikotlin.main.store.DefaultStoreFactory.create(DefaultStoreFactory.kt:30)
	at com.arkivanov.mvikotlin.core.store.StoreFactory$DefaultImpls.create$default(StoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1.<init>(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory.create(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:66)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:63)
	at com.arkivanov.mvikotlin.core.instancekeeper.InstanceKeeperExtKt.getStore(InstanceKeeperExt.kt:9)
	at app.duss.easyproject.presentation.ui.root.RootComponent.<init>(RootComponent.kt:144)
	at MainKt$main$rootComponent$1.invoke(Main.kt:32)
	at MainKt$main$rootComponent$1.invoke(Main.kt:17)
	at MainKt.invokeOnAwtSync$lambda$0(Main.kt:56)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:308)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [CoroutineId(1), "coroutine#1":StandaloneCoroutine{Cancelling}@630c7a4e, Dispatchers.Main[missing, cause=java.lang.ExceptionInInitializerError]]
Caused by: java.lang.ExceptionInInitializerError
	at kotlinx.coroutines.javafx.JavaFxDispatcherKt.initPlatform(JavaFxDispatcher.kt:115)
	at kotlinx.coroutines.javafx.JavaFx.<clinit>(JavaFxDispatcher.kt:77)
	at kotlinx.coroutines.javafx.JavaFxDispatcherFactory.createDispatcher(JavaFxDispatcher.kt:56)
	at kotlinx.coroutines.internal.MainDispatchersKt.tryCreateDispatcher(MainDispatchers.kt:57)
	at kotlinx.coroutines.internal.MainDispatcherLoader.loadMainDispatcher(MainDispatchers.kt:38)
	at kotlinx.coroutines.internal.MainDispatcherLoader.<clinit>(MainDispatchers.kt:22)
	at kotlinx.coroutines.Dispatchers.getMain(Dispatchers.kt:24)
	at app.duss.easyproject.core.utils.AppDispatchersKt$appDispatchers$1.<init>(AppDispatchers.kt:7)
	at app.duss.easyproject.core.utils.AppDispatchersKt.<clinit>(AppDispatchers.kt:6)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.<init>(MainStoreFactory.kt:38)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at com.arkivanov.mvikotlin.main.store.DefaultStoreFactory.create(DefaultStoreFactory.kt:26)
	... 23 more
Caused by: java.lang.RuntimeException: No toolkit found
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:280)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
	at javafx.application.Platform.startup(Platform.java:113)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at kotlinx.coroutines.javafx.PlatformInitializer.<clinit>(JavaFxDispatcher.kt:132)
	... 36 more
Exception in thread "main" java.lang.reflect.InvocationTargetException
	at java.desktop/java.awt.EventQueue.invokeAndWait(EventQueue.java:1371)
	at java.desktop/java.awt.EventQueue.invokeAndWait(EventQueue.java:1346)
	at java.desktop/javax.swing.SwingUtilities.invokeAndWait(SwingUtilities.java:1480)
	at MainKt.invokeOnAwtSync(Main.kt:56)
	at MainKt.main(Main.kt:17)
	at MainKt.main(Main.kt)
Caused by: java.lang.IllegalStateException: Module with the Main dispatcher had failed to initialize
	at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.missing(MainDispatchers.kt:115)
	at kotlinx.coroutines.internal.MissingMainCoroutineDispatcher.isDispatchNeeded(MainDispatchers.kt:96)
	at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:319)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:30)
	at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable$default(Cancellable.kt:25)
	at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:110)
	at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:126)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch(Builders.common.kt:56)
	at kotlinx.coroutines.BuildersKt.launch(Unknown Source)
	at kotlinx.coroutines.BuildersKt__Builders_commonKt.launch$default(Builders.common.kt:47)
	at kotlinx.coroutines.BuildersKt.launch$default(Unknown Source)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.getLoggedInUser(MainStoreFactory.kt:54)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.executeAction(MainStoreFactory.kt:40)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.executeAction(MainStoreFactory.kt:37)
	at com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor.executeAction(CoroutineExecutor.kt:54)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$3.invoke(DefaultStore.kt:65)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$3.invoke(DefaultStore.kt:61)
	at com.arkivanov.mvikotlin.core.store.SimpleBootstrapper.invoke(SimpleBootstrapper.kt:28)
	at com.arkivanov.mvikotlin.main.store.DefaultStore.init(DefaultStore.kt:69)
	at com.arkivanov.mvikotlin.main.store.DefaultStoreFactory.create(DefaultStoreFactory.kt:30)
	at com.arkivanov.mvikotlin.core.store.StoreFactory$DefaultImpls.create$default(StoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1.<init>(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory.create(MainStoreFactory.kt:23)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:66)
	at app.duss.easyproject.presentation.ui.root.RootComponent$rootStore$1.invoke(RootComponent.kt:63)
	at com.arkivanov.mvikotlin.core.instancekeeper.InstanceKeeperExtKt.getStore(InstanceKeeperExt.kt:9)
	at app.duss.easyproject.presentation.ui.root.RootComponent.<init>(RootComponent.kt:144)
	at MainKt$main$rootComponent$1.invoke(Main.kt:32)
	at MainKt$main$rootComponent$1.invoke(Main.kt:17)
	at MainKt.invokeOnAwtSync$lambda$0(Main.kt:56)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:308)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:773)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:720)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:714)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:742)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [CoroutineId(1), "coroutine#1":StandaloneCoroutine{Cancelled}@630c7a4e, Dispatchers.Main[missing, cause=java.lang.ExceptionInInitializerError]]
Caused by: java.lang.ExceptionInInitializerError
	at kotlinx.coroutines.javafx.JavaFxDispatcherKt.initPlatform(JavaFxDispatcher.kt:115)
	at kotlinx.coroutines.javafx.JavaFx.<clinit>(JavaFxDispatcher.kt:77)
	at kotlinx.coroutines.javafx.JavaFxDispatcherFactory.createDispatcher(JavaFxDispatcher.kt:56)
	at kotlinx.coroutines.internal.MainDispatchersKt.tryCreateDispatcher(MainDispatchers.kt:57)
	at kotlinx.coroutines.internal.MainDispatcherLoader.loadMainDispatcher(MainDispatchers.kt:38)
	at kotlinx.coroutines.internal.MainDispatcherLoader.<clinit>(MainDispatchers.kt:22)
	at kotlinx.coroutines.Dispatchers.getMain(Dispatchers.kt:24)
	at app.duss.easyproject.core.utils.AppDispatchersKt$appDispatchers$1.<init>(AppDispatchers.kt:7)
	at app.duss.easyproject.core.utils.AppDispatchersKt.<clinit>(AppDispatchers.kt:6)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.<init>(MainStoreFactory.kt:38)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$create$1$1.invoke(MainStoreFactory.kt:27)
	at com.arkivanov.mvikotlin.main.store.DefaultStoreFactory.create(DefaultStoreFactory.kt:26)
	... 23 more
Caused by: java.lang.RuntimeException: No toolkit found
	at com.sun.javafx.tk.Toolkit.getToolkit(Toolkit.java:280)
	at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:291)
	at javafx.application.Platform.startup(Platform.java:113)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
	at java.base/java.lang.reflect.Method.invoke(Method.java:580)
	at kotlinx.coroutines.javafx.PlatformInitializer.<clinit>(JavaFxDispatcher.kt:132)
	... 36 more

> Task :desktop:run FAILED

And Also I tried to add javaFX deps too:


import org.gradle.internal.os.OperatingSystem
alias(libs.plugins.openjfxJavaFx)
...
val os: OperatingSystem = OperatingSystem.current()
val arch: String = System.getProperty("os.arch")
val isAarch64: Boolean = arch.contains("aarch64")

val platform = when {
    os.isWindows -> "win"
    os.isMacOsX -> "mac"
    else -> "linux"
} + if (isAarch64) "-aarch64" else ""

 ... desktopMain by getting {
            dependencies {
                implementation("org.openjfx:javafx-base:21.0.1:$platform")
                implementation("org.openjfx:javafx-graphics:21.0.1:$platform")
                implementation("org.openjfx:javafx-controls:21.0.1:$platform")
                implementation("org.openjfx:javafx-media:21.0.1:$platform")
                implementation("org.openjfx:javafx-web:21.0.1:$platform")
                implementation("org.openjfx:javafx-swing:21.0.1:$platform")
                // Coroutines
                implementation(libs.kotlinx.coroutines.javafx)
...

but after that, I got into trouble with main dispatcher:

Dec 08, 2023 10:19:06 AM com.sun.javafx.application.PlatformImpl startup
WARNING: Unsupported JavaFX configuration: classes were loaded from 'unnamed module @4d9234c1'
Exception in thread "JavaFX Application Thread @coroutine#1" java.lang.IllegalArgumentException: Not on Main thread, current thread is: Thread[#24,JavaFX Application Thread @coroutine#1,5,system]
	at com.arkivanov.mvikotlin.utils.internal.MainThreadAssertKt.assertOnMainThread(MainThreadAssert.kt:12)
	at com.arkivanov.mvikotlin.core.utils.MainThreadAssertKt.assertOnMainThread(MainThreadAssert.kt:13)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$2.onMessage(DefaultStore.kt:44)
	at com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor.dispatch(CoroutineExecutor.kt:80)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl.access$dispatch(MainStoreFactory.kt:37)
	at app.duss.easyproject.presentation.ui.main.store.MainStoreFactory$ExecutorImpl$getLoggedInUser$1.invokeSuspend(MainStoreFactory.kt:55)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [CoroutineId(1), "coroutine#1":StandaloneCoroutine{Cancelling}@22501f60, Dispatchers.Main]
Exception in thread "JavaFX Application Thread @coroutine#2" java.lang.IllegalArgumentException: Not on Main thread, current thread is: Thread[#24,JavaFX Application Thread @coroutine#2,5,system]
	at com.arkivanov.mvikotlin.utils.internal.MainThreadAssertKt.assertOnMainThread(MainThreadAssert.kt:12)
	at com.arkivanov.mvikotlin.core.utils.MainThreadAssertKt.assertOnMainThread(MainThreadAssert.kt:13)
	at com.arkivanov.mvikotlin.main.store.DefaultStore$init$2.onMessage(DefaultStore.kt:44)
	at com.arkivanov.mvikotlin.extensions.coroutines.CoroutineExecutor.dispatch(CoroutineExecutor.kt:80)
	at app.duss.easyproject.presentation.ui.landing.store.LandingStoreFactory$ExecutorImpl.access$dispatch(LandingStoreFactory.kt:38)
	at app.duss.easyproject.presentation.ui.landing.store.LandingStoreFactory$ExecutorImpl$getLoggedInUser$1.invokeSuspend(LandingStoreFactory.kt:62)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
	at com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
	at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
	Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [CoroutineId(2), "coroutine#2":StandaloneCoroutine{Cancelling}@52ad9a69, Dispatchers.Main]


Nested scrolling and Adaptive Button Sheet not working

@MohamedRejeb

Good job with the library.

Using Adaptive Bottom Sheet to hold a WebView doesn't allow vertical scrolling on Android, yet working fine on iOS.

Had to wrap it in a Columb, yet, although a needles layer, it works but if there's a horizontal carousel in the page being rendered by the WebView, it's bumpy and page moves up and down wherever you swipe left and right.

You can reproduce with an Adaptive Bottom Sheet holding a Column holding a WebView set to open URL https://github.com/MohamedRejeb and scroll to the contributions carousel).

Webview not loading html content

I am trying to use web view on desktop and web. But on desktop, I am getting
Caused by: java.lang.RuntimeException: Error initializing QuantumRenderer: no suitable pipeline found
and the web just keeps loading. Do I need to do additional setup for these platforms? Thank you for the help.

Html content

Thanks for JS enable for webView. Now another question regarding displaying HTML content in WebView. My content has a link to mail in the "mailto:" format. How can I intercept it and open it in the application?

  val stateWebView = rememberWebViewStateWithHTMLData(
        data = HtmlContent,
        mimeType = "text/html",
        encoding = "UTF-8"
    )

    WebView(
        modifier = Modifier
            .fillMaxSize()
            .zIndex(Float.MAX_VALUE),
        state = stateWebView,
        captureBackPresses = false
    )

And the second question. Can I find out how far a user has scrolled through content?

bottom sheet ios scrolling issue

When using Adaptive bottom sheet from Calf, scrolling in iOS (at least on emulator) doesn't work, when using grid or something like that. I haven't tried with LazyColum and Row but I think the behaviour should be same. On Android everything works smoothly.

PHPicker NSUrl is only a temporary file

According to PHPicker's documentation, the NSUrl returned on the loadFileRepresetion handler is only temporary and will get deleted when the callback finishes:

https://developer.apple.com/documentation/foundation/nsitemprovider/2888338-loadfilerepresentation/#discussion

This method writes a copy of the file’s data to a temporary file, which the system deletes when the completion handler returns.

This means that if you get the byteArray right away from the KmpFile on the callback in compose everything will work as expected, but if you store the KmpFile for a future usage, for instance uploading to the server, this won't work.

I'm not sure what's the best solution. WDYT?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.