Skip to content

Commit 4a3c59d

Browse files
authored
Adding web support (js and wasm targets) (#51)
* Adding wasm target * WasmJs implementation * Js support implementation * Updating api and documentation
1 parent bcca06b commit 4a3c59d

File tree

25 files changed

+3434
-37
lines changed

25 files changed

+3434
-37
lines changed

README.md

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,20 @@
66
![badge-android](http://img.shields.io/badge/platform-android-6EDB8D.svg?style=flat)
77
![badge-ios](http://img.shields.io/badge/platform-ios-CDCDCD.svg?style=flat)
88
![badge-desktop](https://img.shields.io/badge/platform-desktop-3474eb.svg?style=flat)
9+
![badge-js](https://img.shields.io/badge/platform-js-fcba03.svg?style=flat)
10+
![badge-wasm](https://img.shields.io/badge/platform-wasm-331f06.svg?style=flat)
11+
12+
913

1014

1115
Simple and easy to use Kotlin Multiplatform Push Notification library (using Firebase Cloud Messaging) targeting ios and android.
1216
This library is used in [FindTravelNow](https://github.com/mirzemehdi/FindTravelNow-KMM/) production KMP project.
1317
You can check out [Documentation](https://mirzemehdi.github.io/KMPNotifier) for full library api information.
1418

1519
## Features
16-
- 🔔 Local and Push Notification (Firebase Cloud Messaging)
17-
- 📱 Multiplatform (android, iOS and desktop(alpha)) (Desktop supports only local notification for now)
20+
- 🔔 Local Notification (android, ios, desktop, js and wasm targets)
21+
- 🔔 Push Notification (Firebase Cloud Messaging) (android and ios only)
22+
- 📱 Multiplatform (android, iOS, desktop and web (js and wasm))
1823

1924
## Installation
2025
Before starting you need to setup basic setup using Firebase official guideline (like initializing project in Firebase, adding `google-services.json` to android, `GoogleService-Info.plist` to iOS).
@@ -68,7 +73,8 @@ plugins {
6873
### Platform Setup
6974
In all platforms on Application Start you need to initialize library using
7075
```kotlin
71-
NotifierManager.initialize(NotificationPlatformConfiguration) //passing android or ios configuration depending on the platform
76+
//passing android, ios, desktop or web configuration depending on the platform
77+
NotifierManager.initialize(NotificationPlatformConfiguration)
7278
```
7379

7480
<details>
@@ -184,6 +190,21 @@ fun main() = application {
184190
}
185191
```
186192

193+
### Web Setup (Js and Wasm)
194+
On
195+
```kotlin
196+
fun main() {
197+
198+
NotifierManager.initialize(
199+
NotificationPlatformConfiguration.Web(
200+
askNotificationPermissionOnStart = true,
201+
notificationIconPath = null
202+
)
203+
)
204+
205+
}
206+
```
207+
187208

188209

189210

@@ -193,7 +214,7 @@ fun main() = application {
193214
You can send either local or push notification.
194215

195216
### Local Notification
196-
217+
Local notifications are supported on Android, iOS, JS and wasm targets.
197218
#### Send notification
198219

199220
```kotlin
@@ -215,7 +236,7 @@ notifier.removeAll() //Removes all notification
215236
```
216237

217238
### Push Notification
218-
239+
Push notifications are supported only for Android and iOS.
219240
#### Listen for push notification token changes
220241
In this method you can send notification token to the server.
221242

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ plugins {
2121

2222
allprojects {
2323
group = "io.github.mirzemehdi"
24-
version = "1.1.0"
24+
version = "1.2.0-alpha"
2525
val sonatypeUsername = gradleLocalProperties(rootDir).getProperty("sonatypeUsername")
2626
val sonatypePassword = gradleLocalProperties(rootDir).getProperty("sonatypePassword")
2727
val gpgKeySecret = gradleLocalProperties(rootDir).getProperty("gpgKeySecret")

gradle.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options\=
66

77
#Compose
88
org.jetbrains.compose.experimental.uikit.enabled=true
9+
org.jetbrains.compose.experimental.wasm.enabled=true
10+
911

1012
#Android
1113
android.useAndroidX=true

gradle/libs.versions.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[versions]
22
compose = "1.6.7"
33
compose-plugin = "1.6.10"
4-
agp = "8.1.4"
4+
agp = "8.2.0"
55
android-minSdk = "21"
66
android-compileSdk = "34"
77
android-targetSdk = "34"
@@ -15,7 +15,7 @@ androidx-espresso-core = "3.5.1"
1515
androidx-startup-runtime = "1.1.1"
1616
kotlin = "2.0.0"
1717
junit = "4.13.2"
18-
koin = "3.5.6"
18+
koin = "3.6.0-Beta5"
1919
kotlinx-binary-validator = "0.13.2"
2020
dokka = "1.9.10"
2121
firebase-messaging = "24.0.0"

kmpnotifier/api/android/kmpnotifier.api

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ public final class com/mmk/kmpnotifier/notification/configuration/NotificationPl
9595
public fun toString ()Ljava/lang/String;
9696
}
9797

98+
public final class com/mmk/kmpnotifier/notification/configuration/NotificationPlatformConfiguration$Web : com/mmk/kmpnotifier/notification/configuration/NotificationPlatformConfiguration {
99+
public fun <init> ()V
100+
public fun <init> (ZLjava/lang/String;)V
101+
public synthetic fun <init> (ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
102+
public final fun getAskNotificationPermissionOnStart ()Z
103+
public final fun getNotificationIconPath ()Ljava/lang/String;
104+
}
105+
98106
public final class com/mmk/kmpnotifier/permission/AndroidPermissionUtil {
99107
public fun <init> (Landroidx/activity/ComponentActivity;)V
100108
public final fun askNotificationPermission (Lkotlin/jvm/functions/Function1;)V

kmpnotifier/api/jvm/kmpnotifier.api

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,14 @@ public final class com/mmk/kmpnotifier/notification/configuration/NotificationPl
9595
public fun toString ()Ljava/lang/String;
9696
}
9797

98+
public final class com/mmk/kmpnotifier/notification/configuration/NotificationPlatformConfiguration$Web : com/mmk/kmpnotifier/notification/configuration/NotificationPlatformConfiguration {
99+
public fun <init> ()V
100+
public fun <init> (ZLjava/lang/String;)V
101+
public synthetic fun <init> (ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
102+
public final fun getAskNotificationPermissionOnStart ()Z
103+
public final fun getNotificationIconPath ()Ljava/lang/String;
104+
}
105+
98106
public abstract interface class com/mmk/kmpnotifier/permission/PermissionUtil {
99107
public abstract fun askNotificationPermission (Lkotlin/jvm/functions/Function0;)V
100108
public abstract fun hasNotificationPermission (Lkotlin/jvm/functions/Function1;)V

kmpnotifier/build.gradle.kts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import org.jetbrains.kotlin.gradle.targets.js.dsl.ExperimentalWasmDsl
2+
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
3+
14
plugins {
25
alias(libs.plugins.kotlinMultiplatform)
36
alias(libs.plugins.androidLibrary)
@@ -16,6 +19,16 @@ kotlin {
1619
}
1720
}
1821

22+
@OptIn(ExperimentalWasmDsl::class)
23+
wasmJs {
24+
browser()
25+
}
26+
js(IR) {
27+
nodejs()
28+
browser()
29+
binaries.library()
30+
}
31+
1932
jvm()
2033
iosX64()
2134
iosArm64()

kmpnotifier/src/commonMain/kotlin/com/mmk/kmpnotifier/di/LibDependencyInitializer.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ private fun Koin.onLibraryInitialized() {
5050
if (askNotificationPermissionOnStart) permissionUtil.askNotificationPermission()
5151
}
5252

53+
Platform.Web -> {
54+
val askNotificationPermissionOnStart =
55+
(configuration as? NotificationPlatformConfiguration.Web)?.askNotificationPermissionOnStart
56+
?: true
57+
if (askNotificationPermissionOnStart) permissionUtil.askNotificationPermission()
58+
}
59+
5360
}
5461
}
5562

kmpnotifier/src/commonMain/kotlin/com/mmk/kmpnotifier/di/PlatformModule.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,6 @@ internal sealed interface Platform {
77
data object Android : Platform
88
data object Ios : Platform
99
data object Desktop : Platform
10+
data object Web : Platform
1011
}
1112
internal expect val platformModule: Module
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.mmk.kmpnotifier.notification
2+
3+
4+
internal class EmptyPushNotifierImpl : PushNotifier {
5+
override suspend fun getToken(): String? {
6+
println("Not implemented: Get firebase token returns null")
7+
return null
8+
}
9+
10+
override suspend fun deleteMyToken() {
11+
println("Not implemented: Delete firebase token is called")
12+
}
13+
14+
override suspend fun subscribeToTopic(topic: String) {
15+
println("Not implemented: Subscribe firebase topic is called")
16+
}
17+
18+
override suspend fun unSubscribeFromTopic(topic: String) {
19+
println("Not implemented: Unsubscribe firebase topic is called")
20+
}
21+
}

0 commit comments

Comments
 (0)