WIP: Add Create Meeting button for registered users with no meetings

- OnboardMeetingListView now shows Create Meeting button for registered users when meetings.length === 0
- Added createMeeting() method to route to meeting setup page
- Maintains "No meetings available" message for unregistered users
- Resolves Test User #0 import flow where chair icon should show Create Meeting option
- Fixed linter errors in databaseUtil.ts and ImportAccountView.vue
This commit is contained in:
Matthew Raymer
2025-07-08 06:18:11 +00:00
parent a81e912b9c
commit 49e57c3911
8 changed files with 520 additions and 107 deletions

View File

@@ -43,7 +43,26 @@
<h2 class="text-xl font-medium">{{ meeting.name }}</h2>
</div>
<p v-if="meetings.length === 0" class="text-center text-gray-500 py-8">
<!-- Create Meeting Button for registered users with no meetings -->
<div
v-if="meetings.length === 0 && isRegistered"
class="text-center py-8"
>
<p class="text-gray-500 mb-4">No onboarding meetings available</p>
<button
class="bg-gradient-to-b from-green-400 to-green-700 shadow-[inset_0_-1px_0_0_rgba(0,0,0,0.5)] text-white px-6 py-3 rounded-md hover:from-green-500 hover:to-green-800 transition-colors"
@click="createMeeting"
>
<font-awesome icon="plus" class="mr-2" />
Create Meeting
</button>
</div>
<!-- No meetings message for unregistered users -->
<p
v-if="meetings.length === 0 && !isRegistered"
class="text-center text-gray-500 py-8"
>
No onboarding meetings available
</p>
</div>
@@ -89,14 +108,13 @@ import { Router } from "vue-router";
import QuickNav from "../components/QuickNav.vue";
import TopMessage from "../components/TopMessage.vue";
import * as databaseUtil from "../db/databaseUtil";
import { logConsoleAndDb } from "../db/databaseUtil";
import { encryptMessage } from "../libs/crypto";
import {
errorStringForLog,
getHeaders,
serverMessageForUser,
} from "../libs/endorserServer";
import { encryptMessage } from "../libs/crypto";
import { PlatformServiceMixin } from "@/utils/PlatformServiceMixin";
interface Meeting {
name: string;
@@ -108,6 +126,7 @@ interface Meeting {
QuickNav,
TopMessage,
},
mixins: [PlatformServiceMixin],
})
export default class OnboardMeetingListView extends Vue {
$notify!: (
@@ -135,57 +154,132 @@ export default class OnboardMeetingListView extends Vue {
showPasswordDialog = false;
async created() {
const settings = await databaseUtil.retrieveSettingsForActiveAccount();
this.activeDid = settings.activeDid || "";
this.apiServer = settings.apiServer || "";
this.firstName = settings.firstName || "";
this.isRegistered = !!settings.isRegistered;
await this.fetchMeetings();
console.log("📋 DEBUG: OnboardMeetingListView created() called");
const settings = await this.$accountSettings();
console.log("📋 DEBUG: Settings loaded:", settings);
// 🔍 TEMPORARY DEBUG: Check raw database for test user registration state
if (settings?.activeDid) {
console.log(
"📋 DEBUG: Checking raw database settings for DID:",
settings.activeDid,
);
try {
// Check master settings
const masterSettings = await this.$query(
"SELECT * FROM settings WHERE id = ?",
[1],
);
console.log("📋 DEBUG: Master settings:", masterSettings);
// Check account-specific settings
const accountSettings = await this.$query(
"SELECT * FROM settings WHERE accountDid = ?",
[settings.activeDid],
);
console.log("📋 DEBUG: Account-specific settings:", accountSettings);
// Check if there are any settings with isRegistered = 1
const registeredSettings = await this.$query(
"SELECT * FROM settings WHERE isRegistered = 1",
);
console.log("📋 DEBUG: All registered settings:", registeredSettings);
// Check all settings for this user
const allSettings = await this.$query("SELECT * FROM settings");
console.log("📋 DEBUG: All settings in database:", allSettings);
} catch (error) {
console.log("📋 DEBUG: Error checking raw database:", error);
}
}
this.activeDid = settings?.activeDid || "";
this.apiServer = settings?.apiServer || "";
this.firstName = settings?.firstName || "";
this.isRegistered = !!settings?.isRegistered;
console.log("📋 DEBUG: activeDid =", this.activeDid);
console.log("📋 DEBUG: apiServer =", this.apiServer);
console.log("📋 DEBUG: firstName =", this.firstName);
console.log("📋 DEBUG: isRegistered =", this.isRegistered);
if (this.isRegistered) {
console.log("📋 DEBUG: User is registered, checking for meetings...");
await this.fetchMeetings();
} else {
console.log("📋 DEBUG: User is NOT registered, skipping meeting check");
}
}
async fetchMeetings() {
console.log("📋 DEBUG: fetchMeetings() called");
console.log("📋 DEBUG: activeDid =", this.activeDid);
console.log("📋 DEBUG: apiServer =", this.apiServer);
this.isLoading = true;
try {
// get the meeting that the user is attending
console.log("📋 DEBUG: Checking if user is attending a meeting...");
const headers = await getHeaders(this.activeDid);
console.log("📋 DEBUG: Headers obtained:", headers);
const response = await this.axios.get(
this.apiServer + "/api/partner/groupOnboardMember",
{ headers },
);
console.log("📋 DEBUG: Member response:", response.data);
if (response.data?.data) {
// they're in a meeting already
console.log(
"📋 DEBUG: User is attending a meeting, fetching details...",
);
const attendingMeetingId = response.data.data.groupId;
// retrieve the meeting details
console.log("📋 DEBUG: Attending meeting ID:", attendingMeetingId);
const headers2 = await getHeaders(this.activeDid);
const response2 = await this.axios.get(
this.apiServer + "/api/partner/groupOnboard/" + attendingMeetingId,
{ headers: headers2 },
);
console.log("📋 DEBUG: Meeting details response:", response2.data);
if (response2.data?.data) {
console.log("📋 DEBUG: Setting attendingMeeting");
this.attendingMeeting = response2.data.data;
console.log("📋 DEBUG: attendingMeeting set:", this.attendingMeeting);
return;
} else {
// this should never happen
logConsoleAndDb(
console.log(
"📋 DEBUG: ERROR: No meeting details found for attending meeting",
);
this.$logAndConsole(
"Error fetching meeting for user after saying they are in one.",
true,
);
}
} else {
console.log("📋 DEBUG: User is NOT attending a meeting");
}
console.log("📋 DEBUG: Fetching available meetings...");
const headers2 = await getHeaders(this.activeDid);
const response2 = await this.axios.get(
this.apiServer + "/api/partner/groupsOnboarding",
{ headers: headers2 },
);
console.log("📋 DEBUG: Available meetings response:", response2.data);
if (response2.data?.data) {
console.log("📋 DEBUG: Setting meetings list");
this.meetings = response2.data.data;
console.log("📋 DEBUG: meetings set:", this.meetings);
} else {
console.log("📋 DEBUG: No meetings found");
}
} catch (error) {
logConsoleAndDb(
} catch (error: any) {
console.log("📋 DEBUG: Error fetching meetings:", error);
console.log("📋 DEBUG: Error response:", error.response?.data);
this.$logAndConsole(
"Error fetching meetings: " + errorStringForLog(error),
true,
);
@@ -224,7 +318,7 @@ export default class OnboardMeetingListView extends Vue {
async submitPassword() {
if (!this.selectedMeeting) {
// this should never happen
logConsoleAndDb(
this.$logAndConsole(
"No meeting selected when prompting for password, which should never happen.",
true,
);
@@ -275,7 +369,7 @@ export default class OnboardMeetingListView extends Vue {
throw { response: postResult };
}
} catch (error) {
logConsoleAndDb(
this.$logAndConsole(
"Error joining meeting: " + errorStringForLog(error),
true,
);
@@ -320,7 +414,7 @@ export default class OnboardMeetingListView extends Vue {
5000,
);
} catch (error) {
logConsoleAndDb(
this.$logAndConsole(
"Error leaving meeting: " + errorStringForLog(error),
true,
);
@@ -341,5 +435,10 @@ export default class OnboardMeetingListView extends Vue {
-1,
);
}
createMeeting() {
console.log("📋 DEBUG: createMeeting() called - routing to meeting setup");
this.$router.push({ name: "onboard-meeting-setup" });
}
}
</script>