Compare commits

..

4 Commits

Author SHA1 Message Date
Nivedin
f8ac6dfeb1 chore: add workspace switcher login A/B testing flow (#4053)
Co-authored-by: Andrew Bastin <andrewbastin.k@gmail.com>
2024-05-10 16:35:42 +05:30
Andrew Bastin
7d2d335b37 chore: revert back default interceptor for sh app to browser 2024-05-10 16:13:51 +05:30
Andrew Bastin
76875db865 chore: bump selfhost-desktop lockfile version 2024-05-10 15:04:16 +05:30
Balu Babu
96e2d87b57 feat: update node version to node20-apline3.19 (#4040) 2024-05-10 14:24:34 +05:30
6 changed files with 51 additions and 19 deletions

View File

@@ -43,12 +43,19 @@
@click="invokeAction('modals.support.toggle')" @click="invokeAction('modals.support.toggle')"
/> />
</div> </div>
<div class="flex"> <div
class="flex"
:class="{
'flex-row-reverse gap-2':
workspaceSelectorFlagEnabled && !currentUser,
}"
>
<div <div
v-if="currentUser === null" v-if="currentUser === null"
class="inline-flex items-center space-x-2" class="inline-flex items-center space-x-2"
> >
<HoppButtonSecondary <HoppButtonSecondary
v-if="!workspaceSelectorFlagEnabled"
:icon="IconUploadCloud" :icon="IconUploadCloud"
:label="t('header.save_workspace')" :label="t('header.save_workspace')"
class="!focus-visible:text-emerald-600 !hover:text-emerald-600 hidden h-8 border border-emerald-600/25 bg-emerald-500/10 !text-emerald-500 hover:border-emerald-600/20 hover:bg-emerald-600/20 focus-visible:border-emerald-600/20 focus-visible:bg-emerald-600/20 md:flex" class="!focus-visible:text-emerald-600 !hover:text-emerald-600 hidden h-8 border border-emerald-600/25 bg-emerald-500/10 !text-emerald-500 hover:border-emerald-600/20 hover:bg-emerald-600/20 focus-visible:border-emerald-600/20 focus-visible:bg-emerald-600/20 md:flex"
@@ -60,9 +67,9 @@
@click="invokeAction('modals.login.toggle')" @click="invokeAction('modals.login.toggle')"
/> />
</div> </div>
<div v-else class="inline-flex items-center space-x-2">
<TeamsMemberStack <TeamsMemberStack
v-if=" v-else-if="
currentUser !== null &&
workspace.type === 'team' && workspace.type === 'team' &&
selectedTeam && selectedTeam &&
selectedTeam.teamMembers.length > 1 selectedTeam.teamMembers.length > 1
@@ -72,6 +79,10 @@
class="mx-2" class="mx-2"
@handle-click="handleTeamEdit()" @handle-click="handleTeamEdit()"
/> />
<div
v-if="workspaceSelectorFlagEnabled || currentUser"
class="inline-flex items-center space-x-2"
>
<div <div
class="flex h-8 divide-x divide-emerald-600/25 rounded border border-emerald-600/25 bg-emerald-500/10 focus-within:divide-emerald-600/20 focus-within:border-emerald-600/20 focus-within:bg-emerald-600/20 hover:divide-emerald-600/20 hover:border-emerald-600/20 hover:bg-emerald-600/20" class="flex h-8 divide-x divide-emerald-600/25 rounded border border-emerald-600/25 bg-emerald-500/10 focus-within:divide-emerald-600/20 focus-within:border-emerald-600/20 focus-within:bg-emerald-600/20 hover:divide-emerald-600/20 hover:border-emerald-600/20 hover:bg-emerald-600/20"
> >
@@ -84,6 +95,7 @@
/> />
<HoppButtonSecondary <HoppButtonSecondary
v-if=" v-if="
currentUser &&
workspace.type === 'team' && workspace.type === 'team' &&
selectedTeam && selectedTeam &&
selectedTeam?.myRole === 'OWNER' selectedTeam?.myRole === 'OWNER'
@@ -124,7 +136,7 @@
</div> </div>
</template> </template>
</tippy> </tippy>
<span class="px-2"> <span v-if="currentUser" class="px-2">
<tippy <tippy
interactive interactive
trigger="click" trigger="click"
@@ -259,6 +271,13 @@ import {
const t = useI18n() const t = useI18n()
const toast = useToast() const toast = useToast()
/**
* Feature flag to enable the workspace selector login conversion
*/
const workspaceSelectorFlagEnabled = computed(
() => !!platform.platformFeatureFlags.workspaceSwitcherLogin?.value
)
/** /**
* Once the PWA code is initialized, this holds a method * Once the PWA code is initialized, this holds a method
* that can be called to show the user the installation * that can be called to show the user the installation
@@ -380,6 +399,8 @@ const inviteTeam = (team: { name: string }, teamID: string) => {
// Show the workspace selected team invite modal if the user is an owner of the team else show the default invite modal // Show the workspace selected team invite modal if the user is an owner of the team else show the default invite modal
const handleInvite = () => { const handleInvite = () => {
if (!currentUser.value) return invokeAction("modals.login.toggle")
if ( if (
workspace.value.type === "team" && workspace.value.type === "team" &&
workspace.value.teamID && workspace.value.teamID &&

View File

@@ -59,7 +59,7 @@
/> />
</div> </div>
<div <div
v-if="!loading && teamListAdapterError" v-else-if="teamListAdapterError"
class="flex flex-col items-center py-4" class="flex flex-col items-center py-4"
> >
<icon-lucide-help-circle class="svg-icons mb-4" /> <icon-lucide-help-circle class="svg-icons mb-4" />
@@ -85,7 +85,7 @@ import { useColorMode } from "@composables/theming"
import { GetMyTeamsQuery } from "~/helpers/backend/graphql" import { GetMyTeamsQuery } from "~/helpers/backend/graphql"
import IconDone from "~icons/lucide/check" import IconDone from "~icons/lucide/check"
import { useLocalState } from "~/newstore/localstate" import { useLocalState } from "~/newstore/localstate"
import { defineActionHandler } from "~/helpers/actions" import { defineActionHandler, invokeAction } from "~/helpers/actions"
import { WorkspaceService } from "~/services/workspace.service" import { WorkspaceService } from "~/services/workspace.service"
import { useService } from "dioc/vue" import { useService } from "dioc/vue"
import { useElementVisibility, useIntervalFn } from "@vueuse/core" import { useElementVisibility, useIntervalFn } from "@vueuse/core"
@@ -157,8 +157,8 @@ const switchToTeamWorkspace = (team: GetMyTeamsQuery["myTeams"][number]) => {
workspaceService.changeWorkspace({ workspaceService.changeWorkspace({
teamID: team.id, teamID: team.id,
teamName: team.name, teamName: team.name,
role: team.myRole,
type: "team", type: "team",
role: team.myRole,
}) })
} }
@@ -174,12 +174,16 @@ watch(
(user) => { (user) => {
if (!user) { if (!user) {
switchToPersonalWorkspace() switchToPersonalWorkspace()
teamListadapter.dispose()
} }
} }
) )
const displayModalAdd = (shouldDisplay: boolean) => { const displayModalAdd = (shouldDisplay: boolean) => {
if (!currentUser.value) return invokeAction("modals.login.toggle")
showModalAdd.value = shouldDisplay showModalAdd.value = shouldDisplay
teamListadapter.fetchList()
} }
defineActionHandler("modals.team.new", () => { defineActionHandler("modals.team.new", () => {

View File

@@ -50,6 +50,7 @@ export default class TeamListAdapter {
} }
public dispose() { public dispose() {
this.teamList$.next([])
this.isDispose = true this.isDispose = true
clearTimeout(this.timeoutHandle as any) clearTimeout(this.timeoutHandle as any)
this.timeoutHandle = null this.timeoutHandle = null

View File

@@ -11,6 +11,7 @@ import { InspectorsPlatformDef } from "./inspectors"
import { ServiceClassInstance } from "dioc" import { ServiceClassInstance } from "dioc"
import { IOPlatformDef } from "./io" import { IOPlatformDef } from "./io"
import { SpotlightPlatformDef } from "./spotlight" import { SpotlightPlatformDef } from "./spotlight"
import { Ref } from "vue"
export type PlatformDef = { export type PlatformDef = {
ui?: UIPlatformDef ui?: UIPlatformDef
@@ -45,6 +46,11 @@ export type PlatformDef = {
* If a value is not given, then the value is assumed to be true * If a value is not given, then the value is assumed to be true
*/ */
promptAsUsingCookies?: boolean promptAsUsingCookies?: boolean
/**
* Whether to show the A/B testing workspace switcher click login flow or not
*/
workspaceSwitcherLogin?: Ref<boolean>
} }
} }

View File

@@ -1260,7 +1260,7 @@ dependencies = [
[[package]] [[package]]
name = "hoppscotch-desktop" name = "hoppscotch-desktop"
version = "24.3.2" version = "24.3.3"
dependencies = [ dependencies = [
"cocoa 0.25.0", "cocoa 0.25.0",
"hex_color", "hex_color",

View File

@@ -26,7 +26,7 @@ createHoppApp("#app", {
history: historyDef, history: historyDef,
}, },
interceptors: { interceptors: {
default: "proxy", default: "browser",
interceptors: [ interceptors: [
{ type: "standalone", interceptor: browserInterceptor }, { type: "standalone", interceptor: browserInterceptor },
{ type: "standalone", interceptor: proxyInterceptor }, { type: "standalone", interceptor: proxyInterceptor },