feat: discord notifications & notify by default

This commit is contained in:
nullishamy 2025-04-04 23:32:59 +01:00
parent 36faaf0b97
commit 5bb5c8a907
Signed by: amy
SSH key fingerprint: SHA256:WmV0uk6WgAQvDJlM8Ld4mFPHZo02CLXXP5VkwQ5xtyk
7 changed files with 164 additions and 14 deletions

19
.direnv/bin/nix-direnv-reload Executable file
View file

@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -e
if [[ ! -d "/home/amy/code/public/oss/frontend" ]]; then
echo "Cannot find source directory; Did you move it?"
echo "(Looking for "/home/amy/code/public/oss/frontend")"
echo 'Cannot force reload with this script - use "direnv reload" manually and then try again'
exit 1
fi
# rebuild the cache forcefully
_nix_direnv_force_reload=1 direnv exec "/home/amy/code/public/oss/frontend" true
# Update the mtime for .envrc.
# This will cause direnv to reload again - but without re-building.
touch "/home/amy/code/public/oss/frontend/.envrc"
# Also update the timestamp of whatever profile_rc we have.
# This makes sure that we know we are up to date.
touch -r "/home/amy/code/public/oss/frontend/.envrc" "/home/amy/code/public/oss/frontend/.direnv"/*.rc

1
.envrc Normal file
View file

@ -0,0 +1 @@
use flake

61
flake.lock generated Normal file
View file

@ -0,0 +1,61 @@
{
"nodes": {
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1743550720,
"narHash": "sha256-hIshGgKZCgWh6AYJpJmRgFdR3WUbkY04o82X05xqQiY=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "c621e8422220273271f52058f618c94e405bb0f5",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1743583204,
"narHash": "sha256-F7n4+KOIfWrwoQjXrL2wD9RhFYLs2/GGe/MQY1sSdlE=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "2c8d3f48d33929642c1c12cd243df4cc7d2ce434",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"lastModified": 1743296961,
"narHash": "sha256-b1EdN3cULCqtorQ4QeWgLMrd5ZGOjLSLemfa00heasc=",
"owner": "nix-community",
"repo": "nixpkgs.lib",
"rev": "e4822aea2a6d1cdd36653c134cacfd64c97ff4fa",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixpkgs.lib",
"type": "github"
}
},
"root": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs"
}
}
},
"root": "root",
"version": 7
}

23
flake.nix Normal file
View file

@ -0,0 +1,23 @@
{
description = "Description for the project";
inputs = {
flake-parts.url = "github:hercules-ci/flake-parts";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
};
outputs = inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ];
perSystem = { config, self', inputs', pkgs, system, ... }: {
devShells.default = pkgs.mkShell {
packages = with pkgs; [
nodePackages.npm
nodejs
];
};
};
flake = {
};
};
}

View file

@ -85,10 +85,14 @@ const ChoreEdit = () => {
const [thingTrigger, setThingTrigger] = useState(null)
const [isThingValid, setIsThingValid] = useState(false)
const [notificationMetadata, setNotificationMetadata] = useState({})
const [notificationMetadata, setNotificationMetadata] = useState({
dueDate: true,
predue: true,
nagging: true
})
const [isRolling, setIsRolling] = useState(false)
const [isNotificable, setIsNotificable] = useState(false)
const [isNotificable, setIsNotificable] = useState(true)
const [isActive, setIsActive] = useState(true)
const [updatedBy, setUpdatedBy] = useState(0)
const [createdBy, setCreatedBy] = useState(0)
@ -710,7 +714,7 @@ const ChoreEdit = () => {
onChange={e => {
setIsNotificable(e.target.checked)
}}
defaultChecked={isNotificable}
defaultChecked={true}
checked={isNotificable}
value={isNotificable}
disabled={!isPlusAccount(userProfile)}

View file

@ -98,6 +98,10 @@ const NotificationSetting = () => {
const [chatID, setChatID] = useState(
userProfile?.notification_target?.target_id,
)
const [webhookURL, setWebhookURL] = useState(
userProfile?.notification_target?.target_id,
)
const [error, setError] = useState('')
const SaveValidation = () => {
switch (notificationTarget) {
@ -116,6 +120,12 @@ const NotificationSetting = () => {
return false
}
break
case '4':
if (webhookURL === '') {
setError('Webhook URL is required')
return false
}
break
default:
break
}
@ -126,7 +136,8 @@ const NotificationSetting = () => {
if (!SaveValidation()) return
UpdateNotificationTarget({
target: chatID,
// 4 = Discord
target: notificationTarget === '4' ? webhookURL : chatID,
type: Number(notificationTarget),
}).then(resp => {
if (resp.status != 200) {
@ -134,13 +145,26 @@ const NotificationSetting = () => {
return
}
setUserProfile({
...userProfile,
notification_target: {
target: chatID,
type: Number(notificationTarget),
},
})
// Discord
if (notificationTarget === '4') {
setUserProfile({
...userProfile,
notification_target: {
target: webhookURL,
type: Number(notificationTarget),
},
})
} else {
// Others (Telegram)
setUserProfile({
...userProfile,
notification_target: {
target: chatID,
type: Number(notificationTarget),
},
})
}
alert('Notification target updated')
})
}
@ -323,7 +347,7 @@ const NotificationSetting = () => {
<Typography level='h3'>Custom Notification</Typography>
<Divider />
<Typography level='body-md'>
Notificaiton through other platform like Telegram or Pushover
Notification through other platform like Telegram or Pushover
</Typography>
<FormControl orientation='horizontal'>
@ -380,6 +404,7 @@ const NotificationSetting = () => {
<Option value='0'>None</Option>
<Option value='1'>Telegram</Option>
<Option value='2'>Pushover</Option>
<Option value='4'>Discord</Option>
<Option value='3'>Webhooks</Option>
</Select>
{notificationTarget === '1' && (
@ -438,6 +463,19 @@ const NotificationSetting = () => {
/>
</>
)}
{notificationTarget === '4' && (
<>
<Typography level='body-sm'>Webhook URL</Typography>
<Input
value={webhookURL}
onChange={e => setWebhookURL(e.target.value)}
placeholder='Webhook URL'
sx={{
width: '200px',
}}
/>
</>
)}
{error && (
<Typography color='warning' level='body-sm'>
{error}

View file

@ -430,14 +430,18 @@ const TaskInput = ({ autoFocus, onChoreUpdate }) => {
assignedTo: userProfile.id,
assignStrategy: 'random',
isRolling: false,
notification: false,
notification: true,
description: description || null,
labelsV2: [],
priority: priority || 0,
status: 0,
frequencyType: 'once',
frequencyMetadata: {},
notificationMetadata: {},
notificationMetadata: {
dueDate: true,
predue: true,
nagging: true
},
}
if (frequency) {