Ricky
Ricky

Reputation: 75

Getting document value in react.js firestore

Can u guys tell me how to get all detail in my document from firestore from my Alarm function? enter image description here

here's my Alarm function:

function Alarm() {
  const dummy = useRef();
  const { uid, displayName } = auth.currentUser;
  const alarmRef = firestore.collection("alarm");
  const query = alarmRef.orderBy("detail");
  const [alarm] = useCollectionData(query, { idField: "id" });
  const [alarmValue, setAlarmValue] = useState("00:00:00 AM");

  const sendAlarm = async (e) => {
    e.preventDefault();

    await alarmRef.add({
      detail: alarmValue,
      displayName,
      uid,
    });
    dummy.current.scrollIntoView({ behavior: "smooth" });
  };

  const stopAlarm = (e) => {
    e.preventDefault();
    document.querySelector(".Sound").pause();
    document.querySelector(".Sound").currentTime = 0;
  };

  const setAlarm = () => {
    var h = document.querySelector(".hours").value;
    var m = document.querySelector(".minutes").value;
    var ap = document.querySelector(".ampm").value;
    var hmap = `${h}:${m}:00 ${ap}`;
    setAlarmValue(hmap);
  };

  return (
    <>
      <form className="sectionInput">
        <div className="alrView">
          {alarm &&
            alarm.map((alr) => (
              <div>
                <AlarmView key={alr.id} alarm={alr} />
              </div>
            ))}
          <span ref={dummy}></span>
        </div>

        <div>
          <select className="hours" onChange={setAlarm}>
            <option>00</option>
            <option>1</option>
            <option>2</option>
            <option>3</option>
            <option>4</option>
            <option>5</option>
            <option>6</option>
            <option>7</option>
            <option>8</option>
            <option>9</option>
            <option>10</option>
            <option>11</option>
            <option>12</option>
          </select>
          <select className="minutes" onChange={setAlarm}>
            <option>00</option>
            <option>01</option>
            <option>02</option>
            <option>03</option>
            <option>04</option>
            <option>05</option>
            <option>06</option>
            <option>07</option>
            <option>08</option>
            <option>09</option>
            <option>10</option>
            <option>11</option>
            <option>12</option>
            <option>13</option>
            <option>14</option>
            <option>15</option>
            <option>16</option>
            <option>17</option>
            <option>18</option>
            <option>19</option>
            <option>20</option>
            <option>21</option>
            <option>22</option>
            <option>23</option>
            <option>24</option>
            <option>25</option>
            <option>26</option>
            <option>27</option>
            <option>28</option>
            <option>29</option>
            <option>30</option>
            <option>31</option>
            <option>32</option>
            <option>33</option>
            <option>34</option>
            <option>35</option>
            <option>36</option>
            <option>37</option>
            <option>38</option>
            <option>39</option>
            <option>40</option>
            <option>41</option>
            <option>42</option>
            <option>43</option>
            <option>44</option>
            <option>45</option>
            <option>46</option>
            <option>47</option>
            <option>48</option>
            <option>49</option>
            <option>50</option>
            <option>51</option>
            <option>52</option>
            <option>53</option>
            <option>54</option>
            <option>55</option>
            <option>56</option>
            <option>57</option>
            <option>58</option>
            <option>59</option>
          </select>
          <select className="ampm" onChange={setAlarm}>
            <option>AM</option>
            <option>PM</option>
          </select>
          <button className="submitTime" type="submit" onClick={sendAlarm}>
            Set Alarm
          </button>
          <button className="stop" onClick={stopAlarm}>
            Stop
          </button>
        </div>
      </form>
    </>
  );
}

I want to make my detail cannot be submited to firestore if the detail duplicate so i need to get all list of my detail, here's my web: https://clockreivc.web.app/ and if i console.log(alarm) from const [alarm] = useCollectionData(query, { idField: "id" }) I got this: enter image description here and I tried console.log(alarm.detail) the error came : TypeError: Cannot read property 'detail' of undefined

Upvotes: 0

Views: 160

Answers (2)

Rafael Lemos
Rafael Lemos

Reputation: 5829

The problem here is that you are getting a list of alarm documents instead of a list of details, which is a field of said document. Also, I would suggest you don't use a useCollectionData hook and instead use a simple SDK call as it could also be generating this issue. So in order to fix it you should do something like this:

const alarmRef = firestore.collection("alarm");
const query = alarmRef.orderBy("detail");
//this is the list you want to use
const details = [];
// not sure you want to use this variable but kept it the example just in case
const [alarms] = query.get().then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        details.push(doc.data().detail);
    }
});

Upvotes: 1

Wajeeh Aslam
Wajeeh Aslam

Reputation: 114

As per the screenshot attached, the alarm is the array of objects. You can console the detail by doing this.

console.log(alarm[0]?.detail);

OR if you want to console all details you can itrate the array

 alarm.forEach(item=> console.log(item.detail));

and I'll suggest you to rename your variable alarm to alarms to avoid confusion.

Upvotes: 0

Related Questions