Fix build failures from rebrand: restore pbxproj exceptions, fix Kotlin casing, move missed source dirs

- Restore 6 missing PBXFileSystemSynchronizedBuildFileExceptionSet entries
  and exceptions arrays on 5 root groups (lost during sed rename)
- Rename extension WidgetIconView.swift to avoid stringsdata collision
  (original had different names: MyCribIconView vs CaseraIconView)
- Rename CaseraExtension.entitlements → HoneyDueExtension.entitlements
- Fix Kotlin object casing: honeyDueShareCodec → HoneyDueShareCodec,
  honeyDuePackageType → HoneyDuePackageType
- Move missed Kotlin source dirs (jsMain, webMain, androidMain/com/casera)
  to com/tt/honeyDue
- Rename remaining Casera widget files to HoneyDue
- Rename CaseraTests.swift → HoneyDueTests.swift

All 4 projects (Go API, iOS, Android, Web) now compile clean.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Trey t
2026-03-07 06:58:56 -06:00
parent 1e2adf7660
commit d3b6b14e78
29 changed files with 83 additions and 341 deletions

View File

@@ -0,0 +1,7 @@
package com.tt.honeyDue
class JsPlatform: Platform {
override val name: String = "Web with Kotlin/JS"
}
actual fun getPlatform(): Platform = JsPlatform()

View File

@@ -0,0 +1,31 @@
package com.tt.honeyDue.analytics
/**
* JS/Web implementation of PostHog Analytics.
* Currently a no-op stub - could be implemented with PostHog JS SDK.
*/
actual object PostHogAnalytics {
actual fun initialize() {
// No-op for web
}
actual fun identify(userId: String, properties: Map<String, Any>?) {
// No-op for web
}
actual fun capture(event: String, properties: Map<String, Any>?) {
// No-op for web
}
actual fun screen(screenName: String, properties: Map<String, Any>?) {
// No-op for web
}
actual fun reset() {
// No-op for web
}
actual fun flush() {
// No-op for web
}
}

View File

@@ -0,0 +1,43 @@
package com.tt.honeyDue.network
import io.ktor.client.*
import io.ktor.client.engine.js.*
import io.ktor.client.plugins.*
import io.ktor.client.plugins.contentnegotiation.*
import io.ktor.client.plugins.logging.*
import io.ktor.serialization.kotlinx.json.*
import kotlinx.browser.window
import kotlinx.serialization.json.Json
actual fun getLocalhostAddress(): String = "127.0.0.1"
actual fun getDeviceLanguage(): String {
return window.navigator.language.split("-").firstOrNull() ?: "en"
}
actual fun getDeviceTimezone(): String {
// Use Intl API to get IANA timezone name (e.g., "America/Los_Angeles")
return js("Intl.DateTimeFormat().resolvedOptions().timeZone") as String
}
actual fun createHttpClient(): HttpClient {
return HttpClient(Js) {
install(ContentNegotiation) {
json(Json {
ignoreUnknownKeys = true
isLenient = true
prettyPrint = true
})
}
install(Logging) {
logger = Logger.DEFAULT
level = LogLevel.ALL
}
install(DefaultRequest) {
headers.append("Accept-Language", getDeviceLanguage())
headers.append("X-Timezone", getDeviceTimezone())
}
}
}

View File

@@ -0,0 +1,13 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import com.tt.honeyDue.models.Contractor
@Composable
actual fun ContractorImportHandler(
pendingContractorImportUri: Any?,
onClearContractorImport: () -> Unit,
onImportSuccess: (Contractor) -> Unit
) {
// Not implemented for JS/Web
}

View File

@@ -0,0 +1,11 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import com.tt.honeyDue.models.Contractor
@Composable
actual fun rememberShareContractor(): (Contractor) -> Unit {
return { _: Contractor ->
// Not implemented for JS/Web
}
}

View File

@@ -0,0 +1,18 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
/**
* JS/Web implementation - no-op since web doesn't have haptic feedback.
*/
class JsHapticFeedbackPerformer : HapticFeedbackPerformer {
override fun perform(type: HapticFeedbackType) {
// Web doesn't support haptic feedback
}
}
@Composable
actual fun rememberHapticFeedback(): HapticFeedbackPerformer {
return remember { JsHapticFeedbackPerformer() }
}

View File

@@ -0,0 +1,19 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.toComposeImageBitmap
import org.jetbrains.skia.Image
@Composable
actual fun rememberImageBitmap(imageData: ImageData): ImageBitmap? {
return remember(imageData) {
try {
val skiaImage = Image.makeFromEncoded(imageData.bytes)
skiaImage.toComposeImageBitmap()
} catch (e: Exception) {
null
}
}
}

View File

@@ -0,0 +1,27 @@
package com.honeydue.platform
import androidx.compose.runtime.Composable
@Composable
actual fun rememberImagePicker(
onImagesPicked: (List<ImageData>) -> Unit
): () -> Unit {
// Web image picker would require HTML5 file input
// This is a placeholder implementation
return {
// TODO: Implement web file input
println("Image picker not yet implemented for web")
}
}
@Composable
actual fun rememberCameraPicker(
onImageCaptured: (ImageData) -> Unit
): () -> Unit {
// Web camera picker would require HTML5 media capture
// This is a placeholder implementation
return {
// TODO: Implement web camera capture
println("Camera picker not yet implemented for web")
}
}

View File

@@ -0,0 +1,16 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import com.tt.honeyDue.ui.subscription.UpgradeScreen
@Composable
actual fun PlatformUpgradeScreen(
onNavigateBack: () -> Unit,
onSubscriptionChanged: () -> Unit
) {
UpgradeScreen(
onNavigateBack = onNavigateBack,
onPurchase = { _ -> onNavigateBack() },
onRestorePurchases = { }
)
}

View File

@@ -0,0 +1,16 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import com.tt.honeyDue.models.JoinResidenceResponse
/**
* JS implementation is a no-op - file imports are not supported on web.
*/
@Composable
actual fun ResidenceImportHandler(
pendingResidenceImportUri: Any?,
onClearResidenceImport: () -> Unit,
onImportSuccess: (JoinResidenceResponse) -> Unit
) {
// No-op on JS - web doesn't support file imports
}

View File

@@ -0,0 +1,15 @@
package com.tt.honeyDue.platform
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import com.tt.honeyDue.models.Residence
/**
* JS implementation is a no-op - sharing is not supported on web.
*/
@Composable
actual fun rememberShareResidence(): Pair<ResidenceSharingState, (Residence) -> Unit> {
val state = remember { ResidenceSharingState() }
val noOp: (Residence) -> Unit = { /* No-op on JS */ }
return Pair(state, noOp)
}

View File

@@ -0,0 +1,16 @@
package com.tt.honeyDue.ui.components.auth
import androidx.compose.runtime.Composable
/**
* JS stub - Google Sign In not implemented for web JS target
*/
@Composable
actual fun GoogleSignInButton(
onSignInStarted: () -> Unit,
onSignInSuccess: (idToken: String) -> Unit,
onSignInError: (message: String) -> Unit,
enabled: Boolean
) {
// No-op on JS
}