Member based search results

I have tried to build a member page to show the reports based on the login user email.

Here is my code on back-end and front-end.

member.jsw

import wixData from 'wix-data';

let options = {
    "suppressAuth": true,
    "suppressHooks": false
};

export function getEmail(userId) {
    return wixData.query("Members/PrivateMembersData")
        .eq("_id", userId)
        .find(options)
        .then((results) => {
            let email = results.items[0].loginEmail;
            return email;
        });
}

export async function getReports(dateStart, dateEnd, statuses, userId) {

    let email = await getEmail(userId);

    return wixData.query("project_data")
        .eq("email", email)
        .hasSome("status", statuses)
        .ge("startDate", dateStart)
        .le("endTime", dateEnd)
        .ascending("startDate")
        .find(options)
        .then((queryResults) => {
            return queryResults.items;
        })
        .catch((error) => {
            Promise.reject(
                new Error('mmeber.jsw > getReports error - details - ' + error.message));
        });

}

page code

import { getEmail, getReports } from 'backend/member_data/member.jsw';
import wixUsers from 'wix-users';

$w.onReady(function () {
    initElements();
});

function initElements() {
    $w('#submitButton').onClick(() => loadReports());

    $w('#checkbox').options = [
        { "value": "STARTED", "label": "STARTED" },
        { "value": "PENDING", "label": "PENDING" },
        { "value": "COMPLETED", "label": "COMPLETED" },
        { "value": "CANCELED", "label": "CANCELED" }
    ];

    $w('#checkbox').value = ["STARTED"];
    $w('#dateStart').value = new Date("2022-01-01T17:00:00.000Z");
    $w('#dateEnd').value = new Date("2022-01-08T17:00:00.000Z");

    $w('#reportsRepeater').onItemReady(($item, data) => {
        $item('#projectDate').text = data.startDate.toLocaleString();
        $item('#serviceName').text = data.service;
        $item('#statusText').text = data.status;
        $item('#document').src = data.document1;
    });
    $w('#reportsRepeater').data = [];
}

async function loadReports() {
    $w('#errorText').hide();
    if (!($w('#dateStart').valid && $w('#dateEnd').valid && $w('#checkbox').valid)) {
        $w('#errorText').show();
        $w('#errorText').text = "Error in form fields"
        return;
    }
}

$w('#submitButton').disable();
const dateStart = $w('#dateStart').value;
const dateEndTemp = $w('#dateEnd').value;
const dateEnd = new Date(dateEndTemp.getTime() + 60 * 60 * 24 * 1000);
const statuses = $w('#checkbox').value;

let email =  function memberData() {
    let user = wixUsers.currentUser;
    if (user.loggedIn) {
        let userId = wixUsers.currentUser.id;
        return getEmail(userId)
            .then((emailquery) => {
                //$w("#welcome").text = String(name);
                let email = emailquery;
                return email;
            });
    }
}

getReports(dateStart, dateEnd, statuses, email).then((results) => {
    $w('#reportsRepeater').data = results;
    if (results.length == 0) {
        $w('#errorText').show();
        $w('#errorText').text = "No reports found";
    } else {
        //$w('#titles').show();
    }
}).catch((error) => {
    console.error('getReports error - ' + error.message);
}).finally(() => {
    $w('#submitButton').enable();
})

What I have after running the page code is:

Anyone who can help me for these errors?

Unless my eyes deceive me, all of the code after the loadReports ( ) function is not contained within a function. So, all of the page elements (buttons, repeater, etc) are not accessible. See the article Where do I put my code? for details.

Thanks for your reply @yisrael-wix I should have pasted here wrongly. Here is the correct code.

import { getEmail, getReports } from 'backend/member_data/member.jsw';
import wixUsers from 'wix-users';

$w.onReady(function () {
    initElements();
});

function initElements() {
    $w('#submitButton').onClick(() => loadReports());

    $w('#checkbox').options = [
        { "value": "STARTED", "label": "STARTED" },
        { "value": "PENDING", "label": "PENDING" },
        { "value": "COMPLETED", "label": "COMPLETED" },
        { "value": "CANCELED", "label": "CANCELED" }
    ];

    $w('#checkbox').value = ["STARTED"];
    $w('#dateStart').value = new Date("2022-01-01T17:00:00.000Z");
    $w('#dateEnd').value = new Date("2022-01-08T17:00:00.000Z");

    $w('#reportsRepeater').onItemReady(($item, data) => {
        $item('#projectDate').text = data.startDate.toLocaleString();
        $item('#serviceName').text = data.service;
        $item('#statusText').text = data.status;
        $item('#document').src = data.document1;
    });
    $w('#reportsRepeater').data = [];
}

async function loadReports() {
    $w('#errorText').hide();
    if (!($w('#dateStart').valid && $w('#dateEnd').valid && $w('#checkbox').valid)) {
        $w('#errorText').show();
        $w('#errorText').text = "Error in form fields"
        return;
    }

    $w('#submitButton').disable();
    const dateStart = $w('#dateStart').value;
    const dateEndTemp = $w('#dateEnd').value;
    const dateEnd = new Date(dateEndTemp.getTime() + 60 * 60 * 24 * 1000);
    const statuses = $w('#checkbox').value;

    let email = function memberData() {
        let user = wixUsers.currentUser;
        if (user.loggedIn) {
            let userId = wixUsers.currentUser.id;
            return getEmail(userId)
                .then((emailquery) => {
                    let email = emailquery;
                    return email;
                });
        }
    }

    getReports(dateStart, dateEnd, statuses, email).then((results) => {
        $w('#reportsRepeater').data = results;
        if (results.length == 0) {
            $w('#errorText').show();
            $w('#errorText').text = "No reports found";
        } else {
            //$w('#titles').show();
        }
    }).catch((error) => {
        console.error('getReports error - ' + error.message);
    }).finally(() => {
        $w('#submitButton').enable();
    })
}

There are still errors on backend code. How can I solve this?

Note that the wix-users API has been deprecated and it is recommended to use wix-members instead. I’m not sure all of what your code is doing, and I’m not sure where the bug is, but I would suggest using the getMember() function which will return the member’s login email.

error appears when it tries to retreive member data.
I tested member data function with one of the user IDs and it worked but it doesn’t work with a parameter.

wix-users API works with other codes with no error for now. I think there is no issue.

I think issue related to the initialization. You are trying to call backend “getEmail” function before $w.onReady (or it is not guaranteed that wixUser. currentUser.id returns you user id.

Something like this can work for you. (copy/pasted with minor changes)

let email;

$w.onReady(function(){
    initElements();
    let user = wixUsers.currentUser;
    if(user.loggedIn) { 
           let userId = wixUsers.currentUser.id;
           return getEmail(userId).then((emailquery) => { 
               email = emailquery;
           })
     }
});

Additionally just interesting why you are not using wix getEmail standard function in client side?
https://www.wix.com/velo/reference/wix-users/user/getemail
It seems you are using current user member, so it can very useful.

I am still getting the same error. Can you check the backend code please ?

@velogenius Can you add some logs in the backend function (getEmail) & be sure that userId is sending properly ?

 console.log("User ID", userId);

@togrul88 It gets the email but shows error still.