Reputation: 75
Can u guys tell me how to get all detail
in my document from firestore from my Alarm function?
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:
and I tried
console.log(alarm.detail)
the error came : TypeError: Cannot read property 'detail' of undefined
Upvotes: 0
Views: 160
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
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