Compare commits

...

9 Commits

Author SHA1 Message Date
jude 9d452ed8cb Fix role selector 2024-05-10 17:37:27 +01:00
jude 441419b92b Bump ver 2024-05-04 13:00:30 +01:00
jude aecf2c15be Store times as local time not UTC 2024-05-04 10:24:20 +01:00
jude 79da56c794 Bump ver 2024-05-03 16:26:52 +01:00
jude ef10902c1e Fix todo list deletion not working properly 2024-05-03 16:21:27 +01:00
jude c277f85c2a Bump dependencies 2024-05-03 16:07:34 +01:00
jude 035653c7fa Bump ver 2024-04-29 08:57:47 +01:00
jude 6358bc3deb Partially revert timezone change 2024-04-29 08:49:01 +01:00
jude 9f5066f982 Bump ver 2024-04-29 08:46:36 +01:00
8 changed files with 821 additions and 660 deletions

2
Cargo.lock generated
View File

@ -2502,7 +2502,7 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
[[package]]
name = "reminder-rs"
version = "1.7.13"
version = "1.7.17"
dependencies = [
"axum",
"base64 0.22.0",

View File

@ -1,6 +1,6 @@
[package]
name = "reminder-rs"
version = "1.7.13"
version = "1.7.17"
authors = ["Jude Southworth <judesouthworth@pm.me>"]
edition = "2021"
license = "AGPL-3.0 only"

File diff suppressed because it is too large Load Diff

View File

@ -17,7 +17,7 @@ export const Mentions = ({ input }) => {
{
trigger: "@",
values: (roles || [])
.filter((role) => role.name === "@everyone")
.filter((role) => role.name !== "@everyone")
.map(({ id, name }) => ({ key: name, value: id })),
allowSpaces: true,
selectTemplate: (item) => `<@&${item.original.value}>`,

View File

@ -10,7 +10,6 @@ import { useQuery } from "react-query";
import "./styles.scss";
import { useGuild } from "../App/useGuild";
import { DEFAULT_COLOR } from "./Embed";
import { useTimezone } from "../App/TimezoneProvider";
function defaultReminder(): Reminder {
return {

View File

@ -16,28 +16,28 @@ export const TimeInput = ({ defaultValue, onInput }) => {
const ref = useRef(null);
const [timezone] = useTimezone();
const [time, setTime] = useState(
defaultValue ? DateTime.fromISO(defaultValue, { zone: "UTC" }) : null,
const [localTime, setLocalTime] = useState(
defaultValue ? DateTime.fromISO(defaultValue, { zone: "UTC" }).setZone(timezone) : null,
);
const updateTime = useCallback(
(upd: TimeUpdate) => {
if (upd === null) {
setTime(null);
setLocalTime(null);
}
let newTime = time;
let newTime = localTime;
if (newTime === null) {
newTime = DateTime.now().setZone("UTC");
newTime = DateTime.now().setZone(timezone);
}
setTime(newTime.setZone(timezone).set(upd).setZone("UTC"));
setLocalTime(newTime.set(upd));
},
[time, timezone],
[localTime, timezone],
);
useEffect(() => {
onInput(time?.setZone("UTC").toFormat("yyyy-LL-dd'T'HH:mm:ss"));
}, [time]);
onInput(localTime?.setZone("UTC").toFormat("yyyy-LL-dd'T'HH:mm:ss"));
}, [localTime]);
const flash = useFlash();
@ -51,14 +51,14 @@ export const TimeInput = ({ defaultValue, onInput }) => {
let dt = DateTime.fromISO(pasteValue, { zone: timezone });
if (dt.isValid) {
setTime(dt);
setLocalTime(dt);
return;
}
dt = DateTime.fromSQL(pasteValue);
if (dt.isValid) {
setTime(dt);
setLocalTime(dt);
return;
}
@ -83,8 +83,8 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={4}
placeholder="YYYY"
value={
time
? time.setZone(timezone).year.toLocaleString("en-US", {
localTime
? localTime.year.toLocaleString("en-US", {
minimumIntegerDigits: 4,
useGrouping: false,
})
@ -114,8 +114,8 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={2}
placeholder="MM"
value={
time
? time.setZone(timezone).month.toLocaleString("en-US", {
localTime
? localTime.month.toLocaleString("en-US", {
minimumIntegerDigits: 2,
})
: ""
@ -144,10 +144,10 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={2}
placeholder="DD"
value={
time
? time
.setZone(timezone)
.day.toLocaleString("en-US", { minimumIntegerDigits: 2 })
localTime
? localTime.day.toLocaleString("en-US", {
minimumIntegerDigits: 2,
})
: ""
}
onBlur={(ev) => {
@ -173,10 +173,10 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={2}
placeholder="hh"
value={
time
? time
.setZone(timezone)
.hour.toLocaleString("en-US", { minimumIntegerDigits: 2 })
localTime
? localTime.hour.toLocaleString("en-US", {
minimumIntegerDigits: 2,
})
: ""
}
onBlur={(ev) => {
@ -203,8 +203,8 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={2}
placeholder="mm"
value={
time
? time.setZone(timezone).minute.toLocaleString("en-US", {
localTime
? localTime.minute.toLocaleString("en-US", {
minimumIntegerDigits: 2,
})
: ""
@ -233,8 +233,8 @@ export const TimeInput = ({ defaultValue, onInput }) => {
maxlength={2}
placeholder="ss"
value={
time
? time.setZone(timezone).second.toLocaleString("en-US", {
localTime
? localTime.second.toLocaleString("en-US", {
minimumIntegerDigits: 2,
})
: ""
@ -276,15 +276,17 @@ export const TimeInput = ({ defaultValue, onInput }) => {
type="datetime-local"
step="1"
value={
time
? time.toFormat("yyyy-LL-dd'T'HH:mm:ss")
: DateTime.now().toFormat("yyyy-LL-dd'T'HH:mm:ss")
localTime
? localTime.toFormat("yyyy-LL-dd'T'HH:mm:ss")
: DateTime.now().setZone(timezone).toFormat("yyyy-LL-dd'T'HH:mm:ss")
}
ref={ref}
onInput={(ev) => {
ev.currentTarget.value === ""
? updateTime(null)
: setTime(DateTime.fromISO(ev.currentTarget.value, { zone: "UTC" }));
: setLocalTime(
DateTime.fromISO(ev.currentTarget.value, { zone: timezone }),
);
}}
></input>
</>

View File

@ -86,36 +86,6 @@ const TimezoneModal = ({ setModalOpen }) => {
</p>
<br></br>
<div class="has-text-centered">
<button
class="button is-success"
style={{
margin: "2px",
}}
id="set-browser-timezone"
onClick={() => {
setSelectedZone(browserTimezone);
}}
>
<span>Use Browser Timezone</span>{" "}
<span class="icon">
<i class="fab fa-firefox-browser"></i>
</span>
</button>
<button
class="button is-success"
id="set-bot-timezone"
style={{
margin: "2px",
}}
onClick={() => {
setSelectedZone(data.timezone);
}}
>
<span>Use Bot Timezone</span>{" "}
<span class="icon">
<i class="fab fa-discord"></i>
</span>
</button>
<button
class="button is-success is-outlined"
id="update-bot-timezone"

View File

@ -282,21 +282,52 @@ impl ComponentDataModel {
.await
.unwrap();
let values = sqlx::query!(
// fucking braindead mysql use <=> instead of = for null comparison
"
SELECT id, value FROM todos WHERE user_id <=> ? AND channel_id <=> ? AND guild_id <=> ?
let values = if let Some(uid) = selector.user_id {
sqlx::query!(
"
SELECT todos.id, value FROM todos
INNER JOIN users ON todos.user_id = users.id
WHERE users.user = ?
",
selector.user_id,
selector.channel_id,
selector.guild_id,
)
.fetch_all(&data.database)
.await
.unwrap()
.iter()
.map(|row| (row.id as usize, row.value.clone()))
.collect::<Vec<(usize, String)>>();
uid,
)
.fetch_all(&data.database)
.await
.unwrap()
.iter()
.map(|row| (row.id as usize, row.value.clone()))
.collect::<Vec<(usize, String)>>()
} else if let Some(cid) = selector.channel_id {
sqlx::query!(
"
SELECT todos.id, value FROM todos
INNER JOIN channels ON todos.channel_id = channels.id
WHERE channels.channel = ?
",
cid,
)
.fetch_all(&data.database)
.await
.unwrap()
.iter()
.map(|row| (row.id as usize, row.value.clone()))
.collect::<Vec<(usize, String)>>()
} else {
sqlx::query!(
"
SELECT todos.id, value FROM todos
INNER JOIN guilds ON todos.guild_id = guilds.id
WHERE guilds.guild = ?
",
selector.guild_id,
)
.fetch_all(&data.database)
.await
.unwrap()
.iter()
.map(|row| (row.id as usize, row.value.clone()))
.collect::<Vec<(usize, String)>>()
};
let resp = show_todo_page(
&values,