1000 Commits

Author SHA1 Message Date
Mo Tarbin
b3b3a0e5a8 release 1.2.49
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-18 08:50:46 -04:00
Mohamad Tarbin
a92eeaf149 Merge pull request #237 from donetick/missing-translation
Missing translation Part 1
2026-08-18 08:44:45 -04:00
Mo Tarbin
86989362fe fix: standardize section separators in README.md 2026-08-18 08:41:48 -04:00
Mo Tarbin
cb81749dbf fix: update ESLint ignores and improve i18n audit script readability 2026-08-18 08:23:19 -04:00
Mo Tarbin
0bac419c3a feat: enhance localization and user experience across various components
- Added new localization keys for project management, settings, and onboarding views.
- Updated labels and placeholders in project modal, password change modal, and backup/restore modal for better clarity.
- Improved user feedback messages for password mismatch and backup creation failures.
- Enhanced the timer details view with localized strings for active work, sessions, and distribution.
- Refined the due date picker modal with localized quick date and time options.
- Updated photo task modal and scan panel to include localized text for better accessibility.
- Ensured consistent use of translation function for all user-facing strings.
2026-08-18 01:31:16 -04:00
Mo Tarbin
1fa4748168 feat: integrate i18n for translation in various components
- Updated NativeCancelSubscriptionModal to use translation keys for titles and messages.
- Enhanced CircleSetupView with translation for notifications and UI text.
- Refactored ThingsView to implement translation for notifications, titles, and descriptions.
- Added translation support in AdvancedOptionsSection for labels and descriptions.
- Implemented i18n in RepeatPickerField for various UI elements and labels.
2026-08-18 01:27:57 -04:00
Mo Tarbin
c1318a2cc4 feat: add i18n support to Settings and AddTaskModal components
- Integrated translation functionality using react-i18next in Settings.jsx
- Replaced hardcoded strings with translation keys for better localization support
- Updated AddTaskModal.jsx to include translations for task-related strings
- Enhanced user experience by providing localized messages for various actions and notifications
2026-08-18 01:11:26 -04:00
Mo Tarbin
cc2e656e14 update localization for notifications, colors, and icons across multiple components 2026-08-18 00:06:34 -04:00
Mo Tarbin
77f87daeba Release 1.2.48
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-17 01:34:15 -04:00
Mohamad Tarbin
64479f0858 Merge pull request #236 from donetick/0815-fixes
0815 fixes
2026-08-17 01:03:36 -04:00
Mohamad Tarbin
4c235c7d00 Merge branch 'develop' into 0815-fixes 2026-08-17 01:03:29 -04:00
Mo Tarbin
c0d2d5a9ec fix: update terminology from "Report a Bug" to "Report an Issue" across multiple components 2026-08-16 18:03:34 -04:00
Mo Tarbin
dae647a4be feat: enhance global search with navigation mode and updated action hints 2026-08-16 17:56:50 -04:00
Mo Tarbin
f27bb79a07 fix: ensure untranslated strings are skipped in Crowdin configuration 2026-08-16 17:08:44 -04:00
Mohamad Tarbin
631d273b02 Merge pull request #174 from scottanderson/eslint3
Pre-commit hooks and CI enforcement for eslint and prettier
2026-08-16 16:32:25 -04:00
Scott Anderson
d4b21f8f4e Enable CI enforcement and pre-commit hooks 2026-08-16 15:51:14 -04:00
Mohamad Tarbin
a407606f1c Merge pull request #235 from donetick/eslint3
ran npx prettier -w .
2026-08-16 15:38:12 -04:00
Mohamad Tarbin
4f21242e39 ran npx prettier -w . 2026-08-16 15:35:44 -04:00
Mohamad Tarbin
2a4f085e18 Merge pull request #234 from donetick/eslint3
ran npm run lint:fix
2026-08-16 15:33:13 -04:00
Mo Tarbin
253514a6e9 remove unused view mode logic and simplify card rendering in ArchivedTasks and CompactChoreCard 2026-08-16 14:07:54 -04:00
Mo Tarbin
e18c829ae7 feat: integrate PostHog for sourcemap uploads and update dependencies 2026-08-16 13:52:42 -04:00
Mo Tarbin
9329eaf3a9 update consent handling and remove unused error capture logic 2026-08-16 13:13:00 -04:00
Mohamad Tarbin
292597e7c6 ran npm run lint:fix 2026-08-16 11:52:40 -04:00
Mohamad Tarbin
e377fb5b06 Merge pull request #233 from donetick/0814-fixes
0814 fixes
2026-08-16 11:32:06 -04:00
Mohamad Tarbin
84f86032c9 Merge pull request #231 from everysingletear/fix/activities-card-scope
fix: ActivitiesCard crashes — t() in a prop default has no scope
2026-08-16 11:27:12 -04:00
Mo Tarbin
834db6b39d Merge remote-tracking branch 'origin/develop' into 0814-fixes
# Conflicts:
#	public/locales/en/labels.json
#	src/views/Chores/MyChores.jsx
#	src/views/Chores/components/ChoreToolbarPrototype.jsx
#	src/views/Chores/components/MultiSelectToolbar.jsx
#	src/views/Chores/hooks/useChoreActions.js
2026-08-16 02:59:24 -04:00
Mo Tarbin
97453803d6 feat: add new view options and update keyboard shortcuts for improved navigation 2026-08-16 02:53:53 -04:00
Mo Tarbin
1c99bd1886 feat: enhance chore management with new modals and filter options 2026-08-16 02:46:04 -04:00
Mo Tarbin
5359ae193b add SortAndFilterMenu component and integrate it into various views for enhanced sorting and filtering capabilities 2026-08-16 02:16:33 -04:00
Mo Tarbin
325d5e6df7 fix: update assignee filter logic and improve display options in MyChores and ChoreToolbarPrototype 2026-08-16 02:07:44 -04:00
Mo Tarbin
79d92ca8c9 add quick actions for creating labels, projects, and filters in GlobalSearchPalette
refactor: move stripHtml function to Helpers utility

fix: update chore filters to include raw description for better search indexing
enhance: implement search parameter handling for modal openings in ProjectView and LabelView
2026-08-16 01:36:20 -04:00
Mo Tarbin
2480049fd1 Improve user feedback and modal behavior in ErrorReportModal and PolicyUpdateModal 2026-08-16 01:26:28 -04:00
Mo Tarbin
5c71e4ce58 fix: handle manual bug reports by modifying error structure in submitErrorReport 2026-08-16 01:07:55 -04:00
Mo Tarbin
77834aa3c0 fix: add z-index to AppModal handle as ReportIssue modal X was not pressable 2026-08-16 00:32:14 -04:00
Mo Tarbin
76fb3500ec fix: update PolicyUpdateModal to open documents in system browser 2026-08-16 00:31:47 -04:00
Mo Tarbin
2d5dd81371 Fix : https://github.com/donetick/donetick/issues/794 2026-08-15 21:36:56 -04:00
Mo Tarbin
c6f7ce48d8 feat: enhance chore actions with bulk operations and new label detail view
- Refactored bulk operations in useChoreActions to streamline completion, archiving, deletion, and other actions.
- Introduced new hooks for managing local chore state during bulk operations.
- Added handleBulkDueDate, handleBulkAssignee, handleBulkPriority, and handleBulkLabels functions for better task management.
- Implemented a new LabelDetailView component to display and manage tasks associated with a specific label.
- Updated LabelView to navigate to LabelDetailView on label click.
- Improved multi-select functionality to support range selection and summary of selected chores.
- Minor UI adjustments and text updates in AdvancedOptionsSection for clarity.
2026-08-15 12:33:39 -04:00
everysingletear
64aca507af fix: ChoresOverview does not parse — hook inserted into an object literal
`CHORE_STATUS` is a module-level object literal, and a `useTranslation`
call ended up inside it:

    const CHORE_STATUS = {
      const { t } = useTranslation('chores')
      NO_DUE_DATE: 'No due date',

That is a syntax error, so the file cannot be parsed at all. It does not
break the build because nothing imports `ChoresOverview` — vite never
compiles it — but it breaks eslint, editors, and anything else that walks
the whole tree.

The hook moves into the component, which is where the file's `t()` calls
actually live.

This one arrived with #210, the same way #216 brought the ActivitiesCard
crash: my tooling wrote the hook in mechanically and nothing downstream
parsed the result. Both are now covered by the `no-undef` pass I described
in the other commit — it reports the parse error too.
2026-08-15 17:02:02 +08:00
everysingletear
d813971809 fix: ActivitiesCard crashes — t() in a prop default has no scope
`ActivitiesCard` takes its title as `({ title = t('activity.title') })`.
A default parameter is evaluated in the function's own scope, where `t`
does not exist: the only `t` in the file is bound inside `ActivityItem`,
a separate component. `Sidepanel` renders the card without a `title`, and
`activities` is `enabled: true` in `DEFAULT_SIDEPANEL_CONFIG`, so the
default is always evaluated on a desktop-width screen.

The hook moves into the component body and the title falls back there
instead. Same rendered output; three render sites now read `displayTitle`.

This is my regression: it arrived with #216, which described itself as
"no behaviour change". It was not caught because a bundler cannot flag it
— an unbound `t` is indistinguishable from a global — and my checks only
verified that keys and imports existed, not that `t` was in scope. It is
visible in the built bundle: `({title:e=t("activity.title")})` keeps the
literal `t` because the minifier cannot rename a free variable, while a
working call nearby minifies to `q=e("common.confirm")`.

I have added an eslint `no-undef` pass to my own pipeline and run it
before sending anything from now on.
2026-08-15 17:01:18 +08:00
Mo Tarbin
7729917611 enhance label search functionality with Fuse.js integration and improved UI 2026-08-15 00:45:51 -04:00
Mohamad Tarbin
96ba672b09 Merge pull request #210 from everysingletear/i18n/chores
i18n: extract the chore list and its modals (Part of #145)
2026-08-15 00:03:09 -04:00
everysingletear
7d36090e46 i18n: extract the chore list and its modals (chores namespace)
Part of #145.

Twenty-three files across the task list zone: the list and card views,
sorting and grouping, multi-select and its toolbar and help sheet,
archived tasks, the assignee card, the chore action menu, the
nudge/NFC/photo modals, the rich text editor, the scan panel, the
notification templates and the keyboard-shortcut toasts.

Extends the existing `chores` namespace, so `src/i18n/config.js` is
untouched.

English only — no translations, no behaviour change. Every t() value is
checked against this branch's base: the string must appear
character-for-character in the code it replaces (247 call sites).

Two values are matched loosely and worth naming: archived.closeMultiSelect
in both the archived view and the toolbar. The base builds that tooltip as
`${size === 0 ? 'Close' : 'Clear'} multi-select (Esc)`, so only one branch
of the ternary exists contiguously in the source. Both keys hold exactly
what each branch renders; the tooltip is kept whole so a translator can
reorder it.

Rebased on current `develop` again after #215 and #216 landed — the
dictionary conflict was theirs, not the code's. No code file in this PR
was touched upstream in the meantime.
2026-08-15 09:03:28 +08:00
Mohamad Tarbin
f43369c960 Merge pull request #229 from donetick/revert-175-enable-dependabot
Revert "Enable dependabot"
2026-08-14 18:56:30 -04:00
Mohamad Tarbin
64fa636413 Revert "Enable dependabot" 2026-08-14 18:56:17 -04:00
Mohamad Tarbin
c1f6431174 Merge pull request #175 from scottanderson/enable-dependabot
Enable dependabot
2026-08-14 18:48:46 -04:00
Mohamad Tarbin
537ab0568b Merge pull request #216 from everysingletear/i18n/regen
i18n: extract the remaining task, history, filter and timer screens (Part of #145)
2026-08-14 18:41:00 -04:00
Mohamad Tarbin
b095f26d61 Merge branch 'develop' into i18n/regen 2026-08-14 18:40:51 -04:00
Mohamad Tarbin
2d776e973a Merge pull request #215 from everysingletear/i18n/leftovers
i18n: extract the strings left behind in already-localized screens (Part of #145)
2026-08-14 18:40:07 -04:00
Mo Tarbin
ddb726ad1f Bump version to 1.2.47
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-14 08:59:25 -04:00
Mohamad Tarbin
67593ec284 Merge pull request #221 from donetick/0813-fixes
0813 fixes
2026-08-14 08:58:34 -04:00
Mo Tarbin
6bc5982294 fix: update key prop in SelectModal options to use item.id for consistency 2026-08-14 08:57:53 -04:00
Mo Tarbin
1dd01e0eca Fix: Fixing Select start render below the modal make it rendioner in modal but keep the modal small so completely overlap with it. fixing that by applying custom global class 2026-08-14 08:55:25 -04:00
Mo Tarbin
7ec8bfe7e6 Release 1.2.46
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-14 01:57:07 -04:00
Mohamad Tarbin
bc62f22e6d Merge pull request #220 from donetick/0812-fixes
fix: update chore ID reference in ChoresOverview and clean up unused …
2026-08-14 01:46:35 -04:00
Mo Tarbin
9e9659c9fe fix: update chore ID reference in ChoresOverview and clean up unused code in HistoryDetailModal and AdvancedOptionsSection 2026-08-14 01:43:01 -04:00
Mohamad Tarbin
ef7810f2d2 Merge pull request #217 from donetick/l10n_develop
New Crowdin updates
2026-08-14 01:36:31 -04:00
Mohamad Tarbin
c8c9f46623 Merge pull request #219 from donetick/0812-fixes
fix: update STATUS_CONFIG to use labelKey for localization
2026-08-14 01:36:12 -04:00
Mo Tarbin
95b31fb14d fix: update STATUS_CONFIG to use labelKey for localization 2026-08-14 01:35:26 -04:00
Mohamad Tarbin
cbba7f6b79 Merge pull request #218 from donetick/analytics
Integrate PostHog and Plausible for enhanced analytics and privacy management
2026-08-14 01:29:02 -04:00
Mo Tarbin
fc12f93316 Merge remote-tracking branch 'origin/develop' into analytics
# Conflicts:
#	public/locales/en/settings.json
#	src/views/Settings/DeveloperSettings.jsx
#	src/views/Settings/SettingsOverview.jsx
2026-08-14 01:26:51 -04:00
Mo Tarbin
27560a078c feat: integrate Plausible analytics script and adjust routing for marketing site 2026-08-14 01:13:46 -04:00
Mohamad Tarbin
cf460b3ba7 New translations timer.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:45 -04:00
Mohamad Tarbin
bd54ee6ab8 New translations things.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:44 -04:00
Mohamad Tarbin
4e0c7eb03c New translations projects.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:43 -04:00
Mohamad Tarbin
9e6f21fc18 New translations points.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:42 -04:00
Mohamad Tarbin
a71ccbe16b New translations labels.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:40 -04:00
Mohamad Tarbin
dce6ba46f2 New translations history.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:39 -04:00
Mohamad Tarbin
3d140091d4 New translations filters.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:38 -04:00
Mohamad Tarbin
3e9c9b465d New translations auth.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:05:37 -04:00
Mohamad Tarbin
578a5dbc84 New translations timer.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:36 -04:00
Mohamad Tarbin
87a623657f New translations things.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:35 -04:00
Mohamad Tarbin
a1c614d1ff New translations projects.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:34 -04:00
Mohamad Tarbin
bb5acd8204 New translations points.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:33 -04:00
Mohamad Tarbin
b2a3055840 New translations labels.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:32 -04:00
Mohamad Tarbin
1a06928f8b New translations history.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:31 -04:00
Mohamad Tarbin
222b24069c New translations filters.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:30 -04:00
Mohamad Tarbin
92795317fe New translations auth.json (Chinese Simplified)
[ci skip]
2026-08-14 01:05:28 -04:00
Mohamad Tarbin
a77c63b73c New translations timer.json (Dutch)
[ci skip]
2026-08-14 01:05:27 -04:00
Mohamad Tarbin
415b2af31a New translations things.json (Dutch)
[ci skip]
2026-08-14 01:05:26 -04:00
Mohamad Tarbin
605eb7f4e6 New translations projects.json (Dutch)
[ci skip]
2026-08-14 01:05:25 -04:00
Mohamad Tarbin
1163085c61 New translations points.json (Dutch)
[ci skip]
2026-08-14 01:05:24 -04:00
Mohamad Tarbin
0ed140a9aa New translations labels.json (Dutch)
[ci skip]
2026-08-14 01:05:23 -04:00
Mohamad Tarbin
57e75d689a New translations history.json (Dutch)
[ci skip]
2026-08-14 01:05:22 -04:00
Mohamad Tarbin
f3808dc0e1 New translations filters.json (Dutch)
[ci skip]
2026-08-14 01:05:20 -04:00
Mohamad Tarbin
dd04d6536c New translations auth.json (Dutch)
[ci skip]
2026-08-14 01:05:19 -04:00
Mohamad Tarbin
96ccf63367 New translations timer.json (Japanese)
[ci skip]
2026-08-14 01:05:18 -04:00
Mohamad Tarbin
735b288c40 New translations things.json (Japanese)
[ci skip]
2026-08-14 01:05:17 -04:00
Mohamad Tarbin
3eedf2bc6b New translations projects.json (Japanese)
[ci skip]
2026-08-14 01:05:16 -04:00
Mohamad Tarbin
061ca90ef1 New translations points.json (Japanese)
[ci skip]
2026-08-14 01:05:15 -04:00
Mohamad Tarbin
a4f141c7b9 New translations labels.json (Japanese)
[ci skip]
2026-08-14 01:05:14 -04:00
Mohamad Tarbin
f914a4d9bd New translations history.json (Japanese)
[ci skip]
2026-08-14 01:05:13 -04:00
Mohamad Tarbin
1fabd374ab New translations filters.json (Japanese)
[ci skip]
2026-08-14 01:05:12 -04:00
Mohamad Tarbin
3bb1cc7114 New translations auth.json (Japanese)
[ci skip]
2026-08-14 01:05:10 -04:00
Mohamad Tarbin
6b066846c8 New translations timer.json (German)
[ci skip]
2026-08-14 01:05:09 -04:00
Mohamad Tarbin
feae64883b New translations things.json (German)
[ci skip]
2026-08-14 01:05:08 -04:00
Mohamad Tarbin
78ddbaf4ed New translations projects.json (German)
[ci skip]
2026-08-14 01:05:07 -04:00
Mohamad Tarbin
dedc5f4cdc New translations points.json (German)
[ci skip]
2026-08-14 01:05:06 -04:00
Mohamad Tarbin
a1f609c551 New translations labels.json (German)
[ci skip]
2026-08-14 01:05:05 -04:00
Mohamad Tarbin
689e390190 New translations history.json (German)
[ci skip]
2026-08-14 01:05:04 -04:00
Mohamad Tarbin
249434de44 New translations filters.json (German)
[ci skip]
2026-08-14 01:05:03 -04:00
Mohamad Tarbin
d09c32216f New translations auth.json (German)
[ci skip]
2026-08-14 01:05:02 -04:00
Mohamad Tarbin
8b6d82c657 New translations timer.json (Arabic)
[ci skip]
2026-08-14 01:05:01 -04:00
Mohamad Tarbin
dc9ec6f9bd New translations things.json (Arabic)
[ci skip]
2026-08-14 01:04:59 -04:00
Mohamad Tarbin
68d9d3d642 New translations projects.json (Arabic)
[ci skip]
2026-08-14 01:04:58 -04:00
Mohamad Tarbin
74efb48236 New translations points.json (Arabic)
[ci skip]
2026-08-14 01:04:57 -04:00
Mohamad Tarbin
206eb69dec New translations labels.json (Arabic)
[ci skip]
2026-08-14 01:04:56 -04:00
Mohamad Tarbin
43387dc56d New translations history.json (Arabic)
[ci skip]
2026-08-14 01:04:55 -04:00
Mohamad Tarbin
7c434602f5 New translations filters.json (Arabic)
[ci skip]
2026-08-14 01:04:54 -04:00
Mohamad Tarbin
ba876ac8bf New translations chores.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:04:53 -04:00
Mohamad Tarbin
afe3964198 New translations chores.json (Chinese Simplified)
[ci skip]
2026-08-14 01:04:52 -04:00
Mohamad Tarbin
7c5b5d534e New translations chores.json (Dutch)
[ci skip]
2026-08-14 01:04:50 -04:00
Mohamad Tarbin
4653074811 New translations chores.json (Japanese)
[ci skip]
2026-08-14 01:04:49 -04:00
Mohamad Tarbin
bcd19c5f67 New translations chores.json (German)
[ci skip]
2026-08-14 01:04:48 -04:00
Mohamad Tarbin
cb5e23086a New translations settings.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:04:47 -04:00
Mohamad Tarbin
87f7f98a64 New translations common.json (Portuguese, Brazilian)
[ci skip]
2026-08-14 01:04:46 -04:00
Mohamad Tarbin
436f2913a5 New translations settings.json (Chinese Simplified)
[ci skip]
2026-08-14 01:04:44 -04:00
Mohamad Tarbin
0f1b4a3296 New translations common.json (Chinese Simplified)
[ci skip]
2026-08-14 01:04:43 -04:00
Mohamad Tarbin
2c82f3f4c0 New translations settings.json (Dutch)
[ci skip]
2026-08-14 01:04:42 -04:00
Mohamad Tarbin
98b2692d07 New translations common.json (Dutch)
[ci skip]
2026-08-14 01:04:41 -04:00
Mohamad Tarbin
e1725e92d4 New translations settings.json (Japanese)
[ci skip]
2026-08-14 01:04:39 -04:00
Mohamad Tarbin
2d8cb79053 New translations common.json (Japanese)
[ci skip]
2026-08-14 01:04:38 -04:00
Mohamad Tarbin
b42c5101b4 New translations settings.json (German)
[ci skip]
2026-08-14 01:04:37 -04:00
Mohamad Tarbin
c73423a5d1 New translations common.json (German)
[ci skip]
2026-08-14 01:04:35 -04:00
Mohamad Tarbin
1eb36ed8e9 New translations auth.json (Arabic)
[ci skip]
2026-08-14 01:04:34 -04:00
Mohamad Tarbin
de1034278e New translations timer.json (Spanish)
[ci skip]
2026-08-14 01:04:33 -04:00
Mohamad Tarbin
a88418fa36 New translations things.json (Spanish)
[ci skip]
2026-08-14 01:04:32 -04:00
Mohamad Tarbin
83ecc89bc5 New translations projects.json (Spanish)
[ci skip]
2026-08-14 01:04:31 -04:00
Mohamad Tarbin
1c89549b01 New translations points.json (Spanish)
[ci skip]
2026-08-14 01:04:30 -04:00
Mohamad Tarbin
62e401e215 New translations labels.json (Spanish)
[ci skip]
2026-08-14 01:04:29 -04:00
Mohamad Tarbin
b75527fe6c New translations history.json (Spanish)
[ci skip]
2026-08-14 01:04:28 -04:00
Mohamad Tarbin
8d6874072e New translations filters.json (Spanish)
[ci skip]
2026-08-14 01:04:26 -04:00
Mohamad Tarbin
0b6f9b581b New translations auth.json (Spanish)
[ci skip]
2026-08-14 01:04:25 -04:00
Mohamad Tarbin
9848adf8c8 New translations timer.json (French)
[ci skip]
2026-08-14 01:04:24 -04:00
Mohamad Tarbin
44647c4e38 New translations things.json (French)
[ci skip]
2026-08-14 01:04:23 -04:00
Mohamad Tarbin
36d33bba48 New translations projects.json (French)
[ci skip]
2026-08-14 01:04:22 -04:00
Mohamad Tarbin
9d9b4a37fb New translations points.json (French)
[ci skip]
2026-08-14 01:04:21 -04:00
Mohamad Tarbin
e0949a9c33 New translations labels.json (French)
[ci skip]
2026-08-14 01:04:20 -04:00
Mohamad Tarbin
a2fd65234b New translations history.json (French)
[ci skip]
2026-08-14 01:04:19 -04:00
Mohamad Tarbin
98693961d4 New translations filters.json (French)
[ci skip]
2026-08-14 01:04:18 -04:00
Mohamad Tarbin
b4512a6cbc New translations auth.json (French)
[ci skip]
2026-08-14 01:04:17 -04:00
Mohamad Tarbin
b98c097b34 New translations chores.json (Arabic)
[ci skip]
2026-08-14 01:04:15 -04:00
Mohamad Tarbin
fa4c11b2ee New translations chores.json (Spanish)
[ci skip]
2026-08-14 01:04:14 -04:00
Mohamad Tarbin
4f0f9e25c5 New translations settings.json (French)
[ci skip]
2026-08-14 01:04:13 -04:00
Mohamad Tarbin
328dcac0e4 New translations chores.json (French)
[ci skip]
2026-08-14 01:04:12 -04:00
Mohamad Tarbin
56a5b49fca New translations settings.json (Arabic)
[ci skip]
2026-08-14 01:04:11 -04:00
Mohamad Tarbin
0669ee9499 New translations common.json (Arabic)
[ci skip]
2026-08-14 01:04:09 -04:00
Mohamad Tarbin
64cd0baa5e New translations settings.json (Spanish)
[ci skip]
2026-08-14 01:04:08 -04:00
Mohamad Tarbin
9860e9d25a New translations common.json (Spanish)
[ci skip]
2026-08-14 01:04:06 -04:00
Mohamad Tarbin
f9c2539fbb New translations common.json (French)
[ci skip]
2026-08-14 01:04:05 -04:00
everysingletear
ede1a11099 i18n: extract the remaining task, history, filter and timer screens
Part of #145.

Sixteen files that were left out of my earlier PRs because my branch also
carried unrelated changes in them. Those are stripped here: each file is
your current `develop` version with the string extraction applied on top,
nothing else.

Covered: the chore action hook and its toasts, activities and smart-insight
cards, the chore toolbar, chore history and its card, saved filters, the
timer details view, project and label modals, the notification picker,
the pending badge, the sync status indicator, the SSE settings and hook,
and the profile avatar menu.

All namespaces already exist, so `src/i18n/config.js` is untouched.
Keys added: 83 `chores`, 31 `common`, 10 `timer`, 9 `history`, 6 `labels`,
5 `projects`, 2 `filters`, 1 `settings`.

English only — no translations, no behaviour change. Every t() value is
checked to appear character-for-character in the code it replaces, or to
match the value already in your dictionary for the same key: 221 call
sites, no mismatches.

Five files from the same batch are deliberately left out. They build
translated labels in module-level constant tables, where the hook cannot
be called — `FilterBar`, `RepeatSection`, `RepeatPickerField`,
`FilterBuilderContent` and `AdvancedOptionsSection`. Those need the key
to travel as data and be resolved inside the component, which is a design
change rather than an extraction, so it deserves its own PR.
2026-08-14 11:26:24 +08:00
everysingletear
6e97c70570 i18n: extract the strings left behind in already-localized screens
Part of #145.

Two files you localized yourself, each with a handful of strings that the
pass didn't reach:

- `ChoreView` — the offline-sync notices ("You're offline — completion
  will sync when back online" and its skip/start/pause/restore siblings)
  and the error toasts they fall back to. 12 keys added to `en/chores.json`.
- `MFASettings` — the "Generate New Codes" button. 1 key added to
  `en/settings.json`.

Both extend namespaces that already exist, so `src/i18n/config.js` is
untouched and this cannot conflict with my other open PRs.

English only — no translations, no behaviour change. Every t() value is
checked to appear character-for-character in the code it replaces, or to
match the value already in your dictionary for the same key (126 call
sites total across both files).
2026-08-14 11:10:35 +08:00
Mo Tarbin
e2b41c85f6 feat: add policy update notice and handling
- Introduced a new policy update modal to inform users of changes to the Privacy Policy and Terms of Service.
- Implemented a service to manage the state of policy updates, including versioning and acknowledgment tracking.
- Added a prompt component that surfaces the policy update modal based on user profile and acknowledgment status.
- Updated Privacy Policy and Terms of Service documents with new effective dates and content.
- Enhanced developer settings to allow manual triggering of the policy update notice for testing purposes.
2026-08-13 22:31:21 -04:00
Mohamad Tarbin
677376983b Merge pull request #207 from donetick/l10n_develop
New Crowdin updates
2026-08-13 19:44:42 -04:00
Mohamad Tarbin
2918eda784 Merge pull request #211 from everysingletear/i18n/settings-remainder
i18n: extract the settings screens not covered by 8c9bf0d (Part of #145)
2026-08-13 19:40:49 -04:00
Mohamad Tarbin
ba8d8fbdb1 Merge pull request #212 from everysingletear/i18n/new-namespaces
i18n: add things, history, projects, labels, filters, timer and points namespaces (Part of #145)
2026-08-13 19:39:39 -04:00
Mo Tarbin
f193c46d73 missing comma 2026-08-13 19:38:07 -04:00
Mohamad Tarbin
da1c8f1068 Merge branch 'develop' into i18n/new-namespaces 2026-08-13 19:35:17 -04:00
Mohamad Tarbin
8b33ba7c5d Merge pull request #209 from everysingletear/i18n/common
i18n: extract shared strings into the existing `common` namespace (Part of #145)
2026-08-13 19:32:47 -04:00
Mohamad Tarbin
323ffe72a0 Merge pull request #208 from everysingletear/i18n/auth-v2
i18n: extract Authorization screens into a new `auth` namespace (Part of #145)
2026-08-13 19:31:56 -04:00
Mohamad Tarbin
5d2d696ddd Merge pull request #214 from donetick/0811-fixes
0811 fixes
2026-08-13 19:30:07 -04:00
Mohamad Tarbin
081942a6cd Merge branch 'develop' into 0811-fixes 2026-08-13 19:28:48 -04:00
Mo Tarbin
462af85a38 Update MUI Joy package version and refactor z-index usage across components 2026-08-13 19:24:23 -04:00
Mohamad Tarbin
2c31919533 New translations common.json (French)
[ci skip]
2026-08-13 12:57:37 -04:00
everysingletear
72aa57f018 i18n: extract things, history, projects, labels, filters, timer and points
Part of #145.

Fourteen files across seven feature areas that had no namespace yet: the
things create/edit modals and their history, the chore history detail and
edit modals, the activity feed, the points view and its redemption modal,
the project view with its selector and icon picker, the label view, the
advanced filter builder and the timer edit modal.

Seven new namespaces registered in `src/i18n/config.js` in one change
rather than one per PR, so the `ns:` array is touched once and my other
extraction PRs cannot conflict with this one. Namespaces stay
feature-scoped as described in #145; if you'd rather fold any of these
into `common` or `chores`, say which and I'll rework it.

Dictionaries: `history` 57 keys, `points` 50, `timer` 25, `projects` 16,
`things` 14, `filters` 13, `labels` 5.

English only — no translations, no behaviour change. Every t() value is
checked against this branch's base: the string must appear
character-for-character in the code it replaces (226 call sites).

Three values in `UserPoints` are matched loosely and worth naming. The
base builds the leaderboard heading and subtitle around a ternary —
`{mode === 'points' ? 'Points' : 'Tasks'} Leaderboard` and `Rankings based
on {…} during the selected time period` — so neither full sentence exists
contiguously in the source. Each key holds exactly what one branch
renders. The sentences are kept whole rather than split around the
ternary, since a sentence assembled from fragments cannot be reordered by
a translator.
2026-08-13 10:21:57 +08:00
everysingletear
0e98a556da i18n: extract the settings screens your pass didn't reach (settings)
Part of #145.

`8c9bf0d` localized the settings views themselves; these eight files sit
in the same zone but were not in that pass: the subscription modal, the
child-user creation and password-change modals, both payment result
views, developer settings, and the backup/restore and account-deletion
modals.

Extends the `settings` namespace you established, following its key
naming — 59 keys added to `en/settings.json`. `src/i18n/config.js` is
untouched.

English only — no translations, no behaviour change. Every t() value is
checked against this branch's base: the string must appear
character-for-character in the code it replaces (71 call sites).

One deliberate structural detail: in `BackupRestoreModal` the warning
reads `<strong>Warning:</strong> Restoring a backup will…`. The label and
the sentence are separate keys and the `<strong>` stays in the JSX, so the
emphasis survives and no markup ends up in the dictionary.

If you'd rather keep developer settings hardcoded, say so and I'll drop
that file — it is the one screen here an end user never sees.
2026-08-13 10:18:10 +08:00
everysingletear
bdac10ac57 i18n: extract shared strings into the existing common namespace
Part of #145.

Fourteen files whose user-facing strings are generic enough to belong in
`common` — loading and empty states, the confirmation modal, the shared
input modals (text/date/user/attachment viewer), the mobile nav bar, the
autocomplete input, the error screen and the file-upload error paths.

Extends the namespace that already exists, so `src/i18n/config.js` is
untouched and this cannot collide with any other extraction PR over the
`ns:` array. 28 keys added to `public/locales/en/common.json`.

English only — no translations, no behaviour change. Every t() value is
checked against this branch's base: the string must appear
character-for-character in the code it replaces (36 call sites).

One value is matched loosely and worth naming: `errorScreen.hideDetails`.
The base renders `{showDetails ? 'Hide' : 'Show'} error details`, so
neither full phrase exists contiguously in the source — only one branch of
the ternary can. Both keys hold exactly what each branch renders. The
sentence is kept whole rather than split around the ternary, because a
split sentence cannot be reordered by a translator.
2026-08-13 10:16:14 +08:00
everysingletear
6dc7c3d370 i18n: extract Authorization screens into a new auth namespace
Every user-facing string under src/views/Authorization/ moves to i18next.
English only — no translations in this PR, so it is language-agnostic and
reviewable as a pure refactor.

Covered:
- LoginView — primary/sub-account tabs, credential form, social and
  Authentik buttons, welcome-back state, every auth error toast
- Signup — account creation form and each field-validation message
- ForgotPasswordView / UpdatePasswordView — reset flow and its toasts
- Authenticating — the OAuth landing screen, including its MFA branches
- MFAVerificationModal — code entry, backup codes, error states
- AuthFields / LoginSettings — shared field labels and server settings

`auth` is registered in src/i18n/config.js; public/locales/en/auth.json
holds the 103 keys. The Crowdin config picks up /public/locales/en/*.json
by glob, so the namespace flows into the pipeline with no change to
crowdin.yml.

No behaviour change: every t() value is the string that rendered before,
character for character — checked mechanically against this branch's base.
The e2e suite selects auth controls by visible text ('Create account',
'Username must be at least 4 characters'), so a green run is the proof.

Two fixes fell out of the extraction:
- AuthPasswordField had label='Password' as a prop default, so neither
  LoginView nor Signup passed one. A default cannot be translated at module
  scope, so the label moves to the call sites and both now pass it.
- AuthDivider defaulted children to 'or' for the same reason; it now falls
  back to t('or').
2026-08-12 20:03:02 +08:00
Mo Tarbin
97a7b12d87 add global error handling and enhance error tracking capabilities 2026-08-12 00:32:38 -04:00
Mo Tarbin
c88790abac feat(analytics): enhance event tracking and add privacy settings for analytics 2026-08-11 23:28:04 -04:00
Mohamad Tarbin
0de0d3ebc0 New translations settings.json (Chinese Simplified)
[ci skip]
2026-08-11 23:05:23 -04:00
Mohamad Tarbin
7eba12e718 Merge pull request #202 from donetick/l10n_develop
New Crowdin updates
2026-08-11 21:45:51 -04:00
Mohamad Tarbin
41c58505fa Merge branch 'develop' into l10n_develop 2026-08-11 21:45:30 -04:00
Mo Tarbin
a58888f0e6 feat(analytics): integrate PostHog for event tracking and user consent management
- Added PostHog SDK to package.json for analytics tracking.
- Implemented analytics consent management with separate toggles for analytics and crash reporting.
- Created analytics module to handle initialization, event tracking, and user identification.
- Integrated analytics tracking into various components including onboarding, feedback prompts, and chore creation.
- Added PrivacyAnalyticsSettings view for managing user consent preferences.
- Enhanced feedback submission with analytics tracking for user interactions.
- Updated device information utility for better context in analytics events.
- Refactored existing code to utilize new analytics functions and ensure proper event sanitization.
2026-08-11 21:42:51 -04:00
Mo Tarbin
fb4d4efe66 Add report bug functionality and settings sections refactor 2026-08-11 17:42:23 -04:00
Mohamad Tarbin
5c9afa0b6e New translations settings.json (French)
[ci skip]
2026-08-11 10:50:28 -04:00
Mohamad Tarbin
e2816bc54d New translations settings.json (Portuguese, Brazilian)
[ci skip]
2026-08-11 10:50:26 -04:00
Mohamad Tarbin
9b71ce910b New translations common.json (Portuguese, Brazilian)
[ci skip]
2026-08-11 10:50:24 -04:00
Mohamad Tarbin
946190c9e0 New translations settings.json (Chinese Simplified)
[ci skip]
2026-08-11 10:50:23 -04:00
Mohamad Tarbin
3e4a44bd00 New translations common.json (Chinese Simplified)
[ci skip]
2026-08-11 10:50:22 -04:00
Mohamad Tarbin
1c1e8e218b New translations settings.json (Dutch)
[ci skip]
2026-08-11 10:50:20 -04:00
Mohamad Tarbin
236deb465a New translations common.json (Dutch)
[ci skip]
2026-08-11 10:50:19 -04:00
Mohamad Tarbin
f0cdcd4f45 New translations settings.json (Japanese)
[ci skip]
2026-08-11 10:50:18 -04:00
Mohamad Tarbin
e26100c308 New translations common.json (Japanese)
[ci skip]
2026-08-11 10:50:16 -04:00
Mohamad Tarbin
f1f6d45e41 New translations settings.json (German)
[ci skip]
2026-08-11 10:50:15 -04:00
Mohamad Tarbin
32b86c0dde New translations common.json (German)
[ci skip]
2026-08-11 10:50:14 -04:00
Mohamad Tarbin
6d968d6a2d New translations settings.json (Arabic)
[ci skip]
2026-08-11 10:50:12 -04:00
Mohamad Tarbin
4642ad1918 New translations common.json (Arabic)
[ci skip]
2026-08-11 10:50:11 -04:00
Mohamad Tarbin
0d7f178d68 New translations settings.json (Spanish)
[ci skip]
2026-08-11 10:50:10 -04:00
Mohamad Tarbin
8af2ed3702 New translations common.json (Spanish)
[ci skip]
2026-08-11 10:50:08 -04:00
Mohamad Tarbin
25eb13d12a New translations common.json (French)
[ci skip]
2026-08-11 10:50:07 -04:00
Mohamad Tarbin
7e8802052a Merge pull request #206 from donetick/localization-settings
feat: enhance localization across settings views
2026-08-11 02:24:59 -04:00
Mo Tarbin
5199240148 feat: update localization files and import moment locales for Hebrew and Japanese 2026-08-11 02:23:35 -04:00
Mo Tarbin
8c9bf0db1d feat: enhance localization across settings views
- Updated LocalizationSettings to use translation keys for titles and descriptions.
- Refactored MFASettings to utilize translation for error messages, success messages, and UI text.
- Improved NotificationSetting by integrating translation for all user-facing strings.
- Initial Hebrew translation ( testing AI translation ( some of crowdin)
- Adjusted ProfileSettings to use translation for the edit photo title.
- Enhanced SettingsOverview to utilize translation for the early access label.
- Updated SidepanelSettings to implement translation for card names and descriptions.
- Refined StorageSettings to use translation for all storage-related messages and titles.
- Improved ThemeSettings to utilize translation for theme descriptions and titles.
2026-08-11 02:19:40 -04:00
Mohamad Tarbin
d34a7e7d34 Merge pull request #205 from donetick/localization-rtl
Localization rtl
2026-08-11 02:11:35 -04:00
Mo Tarbin
4e5222758d Add RTL support for ArrowBack icon in NavBar component 2026-08-11 02:10:12 -04:00
Mo Tarbin
6ace462797 Add RTL support for JoyToggleButtonGroup and implement i18n for search actions 2026-08-11 02:09:56 -04:00
Mo Tarbin
7e4b4b8fd6 Refactor RTL support in contexts and NavBar; update CSS for improved direction handling 2026-08-11 01:47:34 -04:00
Mohamad Tarbin
9bc82b9dc5 Merge pull request #204 from donetick/e2e-add-tests
Add end-to-end tests and enhance authentication flow
2026-08-11 00:59:01 -04:00
Mo Tarbin
dbd1fa72c4 remove e2e workflow 2026-08-11 00:55:40 -04:00
Mo Tarbin
43ffb3da5a Add end-to-end tests for chore and project functionalities, enhance auth flow, and update package version 2026-08-11 00:55:17 -04:00
Mohamad Tarbin
6100738db6 Merge pull request #203 from donetick/e2e-test
Add end-to-end testing setup with Playwright and initial tests
2026-08-10 23:10:03 -04:00
Mohamad Tarbin
c8f97f6957 New translations settings.json (German)
[ci skip]
2026-08-10 22:49:57 -04:00
Mohamad Tarbin
5cbc8a4c37 New translations common.json (German)
[ci skip]
2026-08-10 22:49:55 -04:00
Mohamad Tarbin
2b7dfe68c2 Add way to run the e2e test 2026-08-10 22:47:36 -04:00
Mohamad Tarbin
30ab8d755d New translations settings.json (Portuguese, Brazilian)
[ci skip]
2026-08-10 10:26:47 -04:00
Mohamad Tarbin
77dd689cc6 New translations common.json (Portuguese, Brazilian)
[ci skip]
2026-08-10 10:26:46 -04:00
Mohamad Tarbin
8dc2340b46 New translations settings.json (Chinese Simplified)
[ci skip]
2026-08-10 10:26:44 -04:00
Mohamad Tarbin
950807693c New translations common.json (Chinese Simplified)
[ci skip]
2026-08-10 10:26:42 -04:00
Mohamad Tarbin
d760ede92f New translations settings.json (Dutch)
[ci skip]
2026-08-10 10:26:41 -04:00
Mohamad Tarbin
784b667e95 New translations common.json (Dutch)
[ci skip]
2026-08-10 10:26:40 -04:00
Mohamad Tarbin
677ba280a3 New translations settings.json (Japanese)
[ci skip]
2026-08-10 10:26:38 -04:00
Mohamad Tarbin
e154d3b80e New translations common.json (Japanese)
[ci skip]
2026-08-10 10:26:36 -04:00
Mohamad Tarbin
7f4c47475b New translations settings.json (German)
[ci skip]
2026-08-10 10:26:35 -04:00
Mohamad Tarbin
9921289c9d New translations common.json (German)
[ci skip]
2026-08-10 10:26:34 -04:00
Mohamad Tarbin
80d3b1b7e2 New translations settings.json (Arabic)
[ci skip]
2026-08-10 10:26:32 -04:00
Mohamad Tarbin
36f7dc79e0 New translations common.json (Arabic)
[ci skip]
2026-08-10 10:26:31 -04:00
Mohamad Tarbin
96fc6eb448 New translations settings.json (Spanish)
[ci skip]
2026-08-10 10:26:29 -04:00
Mohamad Tarbin
9244070e30 New translations common.json (Spanish)
[ci skip]
2026-08-10 10:26:28 -04:00
Mohamad Tarbin
c5130ef46a New translations common.json (French)
[ci skip]
2026-08-10 10:26:26 -04:00
Mo Tarbin
c474041c7c Release 1.2.45
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-10 01:40:04 -04:00
Mohamad Tarbin
c649e051d8 Merge pull request #201 from donetick/search-improvments
Search improvments
2026-08-10 01:19:43 -04:00
Mohamad Tarbin
207888affe Merge pull request #198 from donetick/share-with
Share with for circle
2026-08-10 01:19:33 -04:00
Mo Tarbin
5f0c5cdc5d Implement onboarding flow and circle invite handling with new utilities 2026-08-10 01:14:31 -04:00
Mo Tarbin
5b7594ac64 Add apple-app-site-association and assetlinks configuration for app linking 2026-08-10 01:13:06 -04:00
Mo Tarbin
90a38bf091 Add Capacitor Share integration and implement Circle invite sharing feature 2026-08-10 01:13:06 -04:00
Mo Tarbin
eecfc98ebc Refactor ArchivedTasks component: reorder imports, adjust notification hooks, and clean up unused code 2026-08-10 00:55:31 -04:00
Mohamad Tarbin
6428239be2 Merge pull request #200 from donetick/0809-fixes
Fix autocomplete issues and enhance task input handling
2026-08-10 00:54:52 -04:00
Mo Tarbin
4c6e244069 fix: clean up unused imports and simplify component structure in AddTaskModal 2026-08-10 00:53:40 -04:00
Mo Tarbin
af926b033e improve keyboard shortcuts handling 2026-08-10 00:19:57 -04:00
Mo Tarbin
b7bdfa7885 Implement global search feature with context, UI components, and routing updates 2026-08-10 00:16:38 -04:00
Mo Tarbin
309fd32d50 Enhance task input highlighting with smooth appearance animation and improved CSS keyframes for better visual feedback. 2026-08-09 13:19:32 -04:00
Mo Tarbin
2442b0c441 Fix: autocomplete not visible. refactor: streamline task input handling and improve smart input suggestions and and it's performance 2026-08-09 13:19:16 -04:00
Mohamad Tarbin
5d8095bd9c Merge pull request #199 from donetick/0809-fixes
0809 fixes
2026-08-09 13:17:08 -04:00
Mo Tarbin
1a8aeb84cc fix: if user type @Ni and then click Nick then what display was NiNick
fix: if user select assignee keep then if we don't see assignee in the title
2026-08-09 12:28:12 -04:00
Mo Tarbin
b2529a0091 fix autocomplete in addtaskmodal not displaying 2026-08-09 12:22:30 -04:00
Mo Tarbin
841f83d6ae Enhance file upload functionality with document scanning support and improved error handling 2026-08-09 12:00:30 -04:00
Mo Tarbin
731c46b26a Refactor AssigneePickerField to improve value handling and enhance UI/UX for assignee selection 2026-08-09 11:50:51 -04:00
Mo Tarbin
612924e7c3 Add theme background support for light and dark modes in StatusBarManager and ThemeContext
Fix: https://github.com/donetick/donetick/issues/759
2026-08-09 11:50:51 -04:00
Mo Tarbin
78760ceebb Refactor status bar theme handling, attempt to remove the black spaces 2026-08-09 11:50:51 -04:00
Mo Tarbin
e05aa2d169 JoinCircleView: enhance UI/UX with improved messaging, animations, and layout adjustments 2026-08-08 16:01:10 -04:00
Mo Tarbin
1ddf2539e0 Improve circle joining experiance 2026-08-08 13:40:21 -04:00
Mo Tarbin
83a5760959 Enhance error reporting functionality: add bug report option in settings, update error report modal, and refine feedback descriptions 2026-08-07 20:25:06 -04:00
Mo Tarbin
0215a78404 Release 1.2.38
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-07 00:43:15 -04:00
Mohamad Tarbin
475806ac29 Error reporting (#196)
* implement error reporting modal and service integration

* Add session diagnostics for error reporting and enhance API failure tracking
2026-08-07 00:10:51 -04:00
Mohamad Tarbin
903d022877 New Crowdin updates (#191)
* New translations common.json (French)

[ci skip]

* New translations settings.json (French)

[ci skip]

* New translations common.json (Spanish)

[ci skip]

* New translations settings.json (Spanish)

[ci skip]

* New translations common.json (Arabic)

[ci skip]

* New translations settings.json (Arabic)

[ci skip]

* New translations settings.json (German)

[ci skip]

* New translations common.json (Japanese)

[ci skip]

* New translations settings.json (Japanese)

[ci skip]

* New translations common.json (Dutch)

[ci skip]

* New translations settings.json (Dutch)

[ci skip]

* New translations common.json (Chinese Simplified)

[ci skip]

* New translations settings.json (Chinese Simplified)

[ci skip]

* New translations common.json (Portuguese, Brazilian)

[ci skip]

* New translations settings.json (Portuguese, Brazilian)

[ci skip]
2026-08-06 23:57:23 -04:00
Mohamad Tarbin
5fb0b5b656 implement Application and MarketingApp components, enhance routing and user context management (#194) 2026-08-06 23:57:08 -04:00
Mohamad Tarbin
0b4b21bbb0 Refactor chore filtering and search performance (#195)
* Refactor assignment strategy handling in ChoreEdit component

* performance improvement : Refactor chore filtering logic and improve search functionality in MyChores and useChoreFilters hooks. reduce rerender etc...

* making sure the filter clear when it supposed to

* formating
2026-08-06 23:56:15 -04:00
Mo Tarbin
555c9d0774 Release 1.2.37
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-05 02:12:21 -04:00
Mohamad Tarbin
48dbc7a152 Fix button issues, improve layout, and enhance notification handling (#192)
* Fix approval /declien button issue. update action buttons and improve layout

* feat(notifications): enhance notification handling and default templates across components

* fix(sync): improve sync handling to coalesce concurrent requests and prevent lost writes

there is BUG that was very annoying cause by race condition we we update and sync happen as we update and doesn't return the latest added task. this basically fix it
2026-08-05 01:14:39 -04:00
Mohamad Tarbin
784ffbcd00 Fix action button layout and enhance notification handling (#190)
* Fix approval /declien button issue. update action buttons and improve layout

* feat(notifications): enhance notification handling and default templates across components
2026-08-04 21:22:09 -04:00
Mohamad Tarbin
412faf4ad5 Revert "feat(auth): hide password login when disable_password_auth is set (#4…" (#189)
This reverts commit a05f8dc4a4.
2026-08-03 00:39:01 -04:00
Louis-Michel Couture
a05f8dc4a4 feat(auth): hide password login when disable_password_auth is set (#438) (#121)
Thank yWhen the backend resource endpoint reports disable_password_auth, the login
view hides the username/password form, the 'or' divider and the 'Create new
account' button, leaving only the configured SSO button — so SSO-only
instances present a clean login.

Auth options render only once the resource query has settled, so the password
form never flashes before being hidden (no FOUC) on SSO-only instances.

Also drops a dead setUserProfile(user) call in the post-auth effect (the
symbol was removed earlier, leaving a no-undef that broke lint on this file);
the profile now comes from useUserProfile().

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 00:36:05 -04:00
Mo Tarbin
778ae72777 Release 1.2.36
Some checks failed
Build validation / build (push) Has been cancelled
2026-08-02 23:30:42 -04:00
Mohamad Tarbin
dc88fe9704 unifying the empty state across components (#184) 2026-08-02 23:16:32 -04:00
Mohamad Tarbin
5da8724a7b Update release script to add --upload-only option and adjust build conditions; enhance ChoreCard styles for better layout (#188) 2026-08-02 23:16:23 -04:00
Mohamad Tarbin
f57c24e312 New Crowdin updates (#150)
* New translations chores.json (French)

[ci skip]

* New translations chores.json (Spanish)

[ci skip]

* New translations chores.json (Arabic)

[ci skip]

* New translations common.json (French)

[ci skip]

* New translations common.json (Spanish)

[ci skip]

* New translations common.json (Arabic)

[ci skip]

* New translations settings.json (French)

[ci skip]

* New translations settings.json (Spanish)

[ci skip]

* New translations settings.json (Arabic)

[ci skip]

* New translations settings.json (French)

[ci skip]

* New translations chores.json (German)

[ci skip]

* New translations settings.json (German)

[ci skip]

* New translations chores.json (Portuguese)

[ci skip]

* New translations common.json (Portuguese)

[ci skip]

* New translations settings.json (Portuguese)

[ci skip]

* New translations chores.json (Chinese Simplified)

[ci skip]

* New translations common.json (Chinese Simplified)

[ci skip]

* New translations settings.json (Chinese Simplified)

[ci skip]

* New translations chores.json (Portuguese, Brazilian)

[ci skip]

* New translations common.json (Portuguese, Brazilian)

[ci skip]

* New translations settings.json (Portuguese, Brazilian)

[ci skip]

* New translations common.json (German)

[ci skip]
2026-08-02 22:37:51 -04:00
Mo Tarbin
a077afb291 Release 1.2.35 2026-08-02 21:13:15 -04:00
Mohamad Tarbin
66d742d091 Remove gray panel in add task modal and update label interaction (#187)
* Remove the gray panel in add task modal

* migration clicking label to the new advance filtered.

* Fix: Clicking x on filter chip remove the filter condition
2026-08-02 20:53:41 -04:00
Mohamad Tarbin
d641710a41 Reshape onboarding v1.3 (#185)
* Initialize Onboarding Flow

* Shorten Onboarding

* Add Setup circle  and what are the current way to add tasks to the onboarding.
update donetick logo

* improve wording

* Skip onboarding flow for now

* Enable onboarding flow
2026-08-02 20:53:28 -04:00
Mohamad Tarbin
46fb2d5475 Add support for in app feedback (#176) 2026-08-02 16:36:51 -04:00
Mohamad Tarbin
b2949b2dd9 Enhance project management UI and handle bulk changes (#186)
* enable hold to select, remove once x1 chip, unify reschedule modal

* project title still show fromwhen login from different account
it's was cache in local storage so makdikngsure we do clean up

* Fix: show the button for creating task on the modal instead of the panel

* Bulk moving project, Move the button in scanner to the modal

* - Handle bulk change for projects
- allow no assignee being selected
- choreactionmenu become modal on mobile
2026-08-02 16:14:52 -04:00
Scott Anderson
9478f7d0f5 eslint@9, prettier (#105)
* Update build.yml to allow pushes to any branch

Remove branch restriction for push events, which prevents forked projects from running CI checks prior to creating a PR.

* eslint, prettier config only
2026-08-02 02:43:54 -04:00
Mohamad Tarbin
2e0ff5a10c Merge pull request #172 from scottanderson/patch-1
Update build.yml to allow pushes to any branch
2026-08-02 02:40:26 -04:00
Mohamad Tarbin
85826d8068 Merge pull request #141 from everysingletear/fix/available-languages
fix: sync AVAILABLE_LANGUAGES with shipped locales (add zh-CN; drop duplicate ja)
2026-07-31 01:55:40 -04:00
Mohamad Tarbin
9b0af72d74 Merge pull request #182 from donetick/issue-758
allow create task assigned to anyone
2026-07-30 20:30:48 -04:00
Mo Tarbin
eb088a259a allow create task assigned to anyone 2026-07-30 20:29:17 -04:00
Scott Anderson
dcd157274a Update build.yml to allow pushes to any branch
Remove branch restriction for push events, which prevents forked projects from running CI checks prior to creating a PR.
2026-07-30 16:54:09 -04:00
Mohamad Tarbin
19ed0ba3ab Merge pull request #180 from donetick/reshape-onboarding-v1
Reshape onboarding v1
2026-07-30 02:21:25 -04:00
Mo Tarbin
b8fe2833b6 allow numbers in username 2026-07-30 02:02:08 -04:00
Mo Tarbin
c39bbe5984 Remove Logo from sign up and login flow 2026-07-30 02:02:08 -04:00
Mo Tarbin
9950d8ff6c Remove Logo from sign up and login flow 2026-07-30 02:02:08 -04:00
Mo Tarbin
99b467488f revamp login and signup screens 2026-07-30 02:02:08 -04:00
Mohamad Tarbin
8dfaa4d8c6 Merge pull request #179 from donetick/revamp-modals
Revamp modals
2026-07-30 01:34:26 -04:00
Mo Tarbin
000e4d0d61 update Button Radius 2026-07-30 01:32:21 -04:00
Mo Tarbin
0132408eec Unify modals and buttons style and layout 2026-07-29 10:38:20 -04:00
Mo Tarbin
b4d46caee4 Release 1.2.34 2026-07-29 02:45:24 -04:00
Scott Anderson
dfa07aa5d1 dependabot 2026-07-28 22:44:36 -04:00
Mo Tarbin
f92063dfe9 hotfix: OAuth login being aborted by a forced logout on Android
The app logged itself out in the middle of the OAuth code exchange,
tearing down the page before the callback request could finish.

On resume, the deep-link handler and the sync-on-resume listener fire in
the same tick. Sync ran first, hit a 401 (no session exists yet), and
ApiClient treated that as an expired session: it cleared tokens, wiped
the offline DB, and hard-navigated to /login via window.location.href.
That reload aborted the in-flight POST /auth/oauth2/callback, surfacing
as "Authentication request failed TypeError: Failed to fetch".
2026-07-28 20:45:29 -04:00
Mo Tarbin
ce07e467f3 release 1.2.33 2026-07-28 17:40:44 -04:00
Mohamad Tarbin
f6adc99187 Merge pull request #171 from donetick/support-audio-input
Support audio input
2026-07-28 02:31:38 -04:00
Mohamad Tarbin
950645cc96 Merge branch 'develop' into support-audio-input 2026-07-28 02:31:16 -04:00
Mo Tarbin
cb71b6074d Add Previous for the widgets 2026-07-28 02:15:56 -04:00
Mo Tarbin
bb87dc2e14 Add quick capture widget 2026-07-28 02:02:44 -04:00
Mo Tarbin
ce49e4afc6 Move cancel button to the modal 2026-07-28 02:02:24 -04:00
Mo Tarbin
ea89f90edb fix label picker keep open wnhe something chosen 2026-07-28 00:17:40 -04:00
Mo Tarbin
8cba22024a Fix Choretoolbar display active when it should always stay neutral 2026-07-28 00:03:04 -04:00
Mo Tarbin
9044193aa3 Fix Adding labels to match the way we have it in EditChore 2026-07-27 23:55:27 -04:00
Mo Tarbin
b145bb422b reduce the noise by making the color just a small badge 2026-07-27 23:43:39 -04:00
Mo Tarbin
5a4f67d70a Add back Quick access to the filters 2026-07-27 22:45:49 -04:00
Mo Tarbin
09c3dbbebc fix(voice): harden native recognition loop and match labels to existing ones only
Add heartbeat/timeout recovery for silently-dead Android recognizer sessions,
wait for and prefer the late-arriving final transcript over the interim
partial, and guard against duplicate commits when it lands after restart.
Bias native recognition toward circle member/label names via contextualStrings
so unfamiliar names aren't auto-corrected. Restrict spoken "label X" to
existing labels (exact or closest fuzzy match) instead of creating new ones,
removing the now-unused label-creation flow from AddTaskModal/VoicePanel/
parseVoiceTask.
2026-07-26 21:41:56 -04:00
Mo Tarbin
ad1f85ffcc Update Gemfile 2026-07-26 13:26:51 -04:00
Mohamad Tarbin
ec8eb39599 Merge pull request #165 from donetick/hotfix-07-24
Attempt to fix capacitor sqlite error and update social login to make…
2026-07-25 17:41:05 -04:00
Mo Tarbin
adca4c3af9 Attempt to fix capacitor sqlite error and update social login to make sure we exclude any facebook sdk 2026-07-25 17:35:43 -04:00
everysingletear
f5da57d7f7 fix: sync AVAILABLE_LANGUAGES with shipped locales (add zh-CN; drop duplicate ja)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-21 15:58:48 +08:00
Mo Tarbin
a133b271d0 ability to parse user and label 2026-07-20 09:54:39 -04:00
Mo Tarbin
e0257445ef Add Initial Voice Input 2026-07-20 01:41:42 -04:00
Mohamad Tarbin
65c774d0d0 Merge pull request #159 from donetick/respecting-ca-from-user-store
fix(android): trust user-installed CA certificates
2026-07-18 18:00:01 -04:00
Mo Tarbin
2e5f0a3725 fix(android): trust user-installed CA certificates 2026-07-18 17:58:41 -04:00
Mohamad Tarbin
ebae9b78b1 Merge pull request #158 from donetick/add-widget-ios-android
Add home-screen widgets for iOS and Android (Today, Next 7 Days, People)
2026-07-18 17:14:41 -04:00
Mo Tarbin
b73586f81b Add support for iOS and android widgets 2026-07-18 17:10:23 -04:00
Mo Tarbin
74d658f928 Release 1.2.16 2026-07-18 03:15:20 -04:00
Mohamad Tarbin
24a1572752 Merge pull request #153 from donetick/upload-and-attachment
Improve Offline mode and stop temp id position, stuck commands can no…
2026-07-18 02:32:11 -04:00
Mo Tarbin
80099635be Improve Offline mode and stop temp id position, stuck commands can no longer block the pipeline, Fix Spurious Offline flip, Ghost Chore when switching accounts 2026-07-18 02:31:00 -04:00
Mohamad Tarbin
cd28526ccc Merge pull request #152 from donetick/upload-and-attachment
Upload and attachment
2026-07-18 02:28:12 -04:00
Mo Tarbin
277e10daf1 fix IOS sqlite return metadata as first row 2026-07-18 02:20:31 -04:00
Mo Tarbin
a6fb3c87c4 Refactor Attchemnt Upload and fix bug with signing 2026-07-18 02:16:42 -04:00
Mohamad Tarbin
bf6474a488 Merge pull request #151 from donetick/deeplink-fixes
Fix Notification deeplink
2026-07-17 19:34:01 -04:00
Mo Tarbin
08f8d6ac6a Fix Notification deeplink 2026-07-17 19:33:33 -04:00
Mo Tarbin
0c80efc686 add mapping for crowdin 2026-07-16 22:35:45 -04:00
Mo Tarbin
e1b6561b70 %two_letters_code% to %locale% in crowdin.yml. 2026-07-16 22:24:46 -04:00
Mo Tarbin
56e91db0b4 Release 1.2.12 : Remove NDEF and PACE from NFC permission. fix login with google entitlement 2026-07-16 20:55:40 -04:00
Mohamad Tarbin
ce3b6fdc37 Merge pull request #149 from donetick/fix-login-with-google-2
fix(ios): register Google Sign-In URL scheme to prevent launch crash
2026-07-16 19:41:03 -04:00
Mo Tarbin
885427fa85 fix(ios): register Google Sign-In URL scheme to prevent launch crash
Merge duplicate CFBundleURLTypes entries in Info.plist so the Google
reversed-client-ID scheme and the donetick deep-link scheme coexist.
The second entry was overriding the first, causing GIDSignIn to throw
NSInvalidArgumentException for a missing URL scheme.
2026-07-16 19:40:34 -04:00
Mo Tarbin
b77365e60f Release 1.2.12 2026-07-16 19:07:50 -04:00
Mohamad Tarbin
b3d601aa35 Merge pull request #148 from donetick/fix-login-with-google
Fix login with google
2026-07-16 18:53:57 -04:00
Mo Tarbin
f1aca45ce3 Update version 2026-07-16 18:53:32 -04:00
Mo Tarbin
46b1902af2 force login before login with google 2026-07-16 18:52:05 -04:00
Mohamad Tarbin
96cee7e5c2 Merge pull request #140 from donetick/07-14-bug-fixes
07 14 bug fixes
2026-07-14 21:10:11 -04:00
Mo Tarbin
8a32811226 Add Advance option section 2026-07-14 19:15:20 -04:00
Mohamad Tarbin
18dbaee4b5 Merge pull request #139 from donetick/fastline
Integrate with Fastline to automate App stores/ Playstore release
2026-07-14 17:34:28 -04:00
Mo Tarbin
9c7cea23a7 Add More options to AddTaskModal to handle most of the things we have in editChore 2026-07-14 14:24:43 -04:00
Mo Tarbin
519b085dd2 fix: pressing shift +enter in task title field open the task desc 2026-07-14 14:22:34 -04:00
Mo Tarbin
66d3bc6c7b fix: add ability to create label in label picker 2026-07-14 12:59:47 -04:00
Mo Tarbin
40270f219a Fix: make sure the calendar doesn't take the full screen on desktop 2026-07-14 12:29:32 -04:00
Mo Tarbin
08fba15fee fix https://github.com/donetick/frontend/issues/95 2026-07-14 12:24:40 -04:00
Mo Tarbin
379e1a354b Update to include publishing the apps 2026-07-14 12:17:13 -04:00
Mo Tarbin
eacfca715c Integrate with Fastline, Create a release script 2026-07-14 12:16:36 -04:00
Mo Tarbin
4bfff4b7e9 Add script to handle secrets fetching 2026-07-14 11:57:29 -04:00
Mo Tarbin
bbad583e53 fix: correct day-of-month recurrence parsing to use monthly interval and set next due date 2026-07-14 11:15:50 -04:00
Mo Tarbin
359202a594 fix: clear offline data on logout, session expiry, server change, and login
Offline DB was never wiped during logout, token expiry, or server URL
change, allowing stale data to persist across users and servers. Also
plugs the refresh-token expiry path which bypassed handleLogout entirely.
2026-07-14 11:08:46 -04:00
Mo Tarbin
7f68f7dd9d update permissions in AndroidManifest.xml for better compatibility and security to fix google play issue:
```Your app cannot make use of the READ_MEDIA_IMAGES or READ_MEDIA_VIDEO permissions because it only needs one-time or infrequent access to a device’s media files. To use these permissions, your app’s core functionality must need persistent access to photo and video files.
```
2026-07-13 02:44:14 -04:00
Mo Tarbin
77a9de570c release Prep: update version codes to 28 and marketing version to 1.2.7 in build.gradle, project.pbxproj, and package.json 2026-07-13 00:50:03 -04:00
Mo Tarbin
a02b193b90 implement NFC intent normalization in MainActivity for Donetick 2026-07-13 00:46:48 -04:00
Mo Tarbin
789eb30d2b chore: update iOS project version to 28 and marketing version to 1.2.6; add sensitive files to .gitignore 2026-07-13 00:32:04 -04:00
Mohamad Tarbin
7a653a5bb7 Merge pull request #135 from donetick/bugfixes-07-09-2026
improve task management
2026-07-13 00:21:40 -04:00
Mo Tarbin
c929977773 add filter options for created and updated dates in SortAndGrouping component 2026-07-13 00:17:27 -04:00
Mo Tarbin
d21ec9d727 make choosing color match advance filter color selector 2026-07-12 23:34:47 -04:00
Mo Tarbin
5332d0ac62 streamline task management in SubTask component. have better shortcut and keyboard movement 2026-07-12 23:34:19 -04:00
Mo Tarbin
6508eb57fc Merge branch 'develop' of https://github.com/Donetick/frontend into bugfixes-07-09-2026 2026-07-12 18:11:22 -04:00
Mo Tarbin
b7cc19b719 format 2026-07-12 18:11:00 -04:00
Mo Tarbin
925ebf3210 fix: correct file patterns in Crowdin configuration for locale files 2026-07-12 18:07:22 -04:00
Mo Tarbin
b1ff6805eb fix: update NFC URL generation to support iOS platform in ChoreModals component 2026-07-12 18:07:22 -04:00
cm-moment
1f4646dbdc feat: 新增简体中文(zh-CN)语言汉化包
1. 新增 zh-CN 简体中文国际化目录
2. 完成 chores、common、settings 页面全部文本汉化
3. 语言编码遵循 BCP47 标准,与现有多语言目录结构统一
2026-07-12 18:07:22 -04:00
Mo Tarbin
6612e77579 fix: implement UUID generation utility and replace crypto.randomUUID usage (to support genertaion when we are in http )in task and chore components 2026-07-12 18:07:22 -04:00
tanomitsu
2fd6d5cd2e feat: add Japanese (ja) localization
- Add ja translations for common, settings, and chores namespaces
- Register ja in AVAILABLE_LANGUAGES so it appears in the language picker
- Import moment/locale/ja so date and relative-time formatting uses Japanese
2026-07-12 18:07:17 -04:00
Mohamad Tarbin
0531b97e19 Merge pull request #134 from donetick/bugfixes-07-09-2026
Update NFC URL generation for iOS and fix Crowdin file patterns
2026-07-10 01:45:58 -04:00
Mo Tarbin
7336b52e14 fix: correct file patterns in Crowdin configuration for locale files 2026-07-10 01:45:16 -04:00
Mohamad Tarbin
cc03275ad3 Merge pull request #132 from cm-moment/develop
feat: Add Simplified Chinese (zh-CN) localization新增简体中文(zh-CN)语言汉化包
2026-07-10 01:24:56 -04:00
Mo Tarbin
09909514d5 fix: update NFC URL generation to support iOS platform in ChoreModals component 2026-07-10 01:07:55 -04:00
Mohamad Tarbin
a3dd8cb00d Merge pull request #133 from donetick/bugfixes-07-09-2026
fix: implement UUID generation utility and replace crypto.randomUUID …
2026-07-09 14:44:35 -04:00
Mo Tarbin
d207f7e2b2 fix: implement UUID generation utility and replace crypto.randomUUID usage (to support genertaion when we are in http )in task and chore components 2026-07-09 14:44:05 -04:00
Mohamad Tarbin
cc348e5d35 Merge pull request #112 from tanomitsu/feature/ja-localization
Add Japanese (ja) localization
2026-07-09 11:00:19 -04:00
cm-moment
aeed19532f feat: 新增简体中文(zh-CN)语言汉化包
1. 新增 zh-CN 简体中文国际化目录
2. 完成 chores、common、settings 页面全部文本汉化
3. 语言编码遵循 BCP47 标准,与现有多语言目录结构统一
2026-07-09 20:17:36 +08:00
Mohamad Tarbin
b52f870e29 Merge pull request #131 from donetick/bugfixes-07-08-2026
Bugfixes 07 08 2026
2026-07-08 14:13:30 -04:00
Mo Tarbin
7889c32be0 fix: simplify Node.js setup in build workflow by removing version matrix 2026-07-08 14:13:18 -04:00
Mo Tarbin
1ca91d684f fix: remove redundant lint job from build workflow and ensure main branch is specified for push events 2026-07-08 14:08:41 -04:00
Mo Tarbin
648f76bd22 fix: update version codes and add local networking support in iOS Info.plist 2026-07-08 14:06:03 -04:00
Mo Tarbin
f8d772149b fix: enhance SSE connection handling for native platforms and implement ticket fetching 2026-07-08 13:56:10 -04:00
Mo Tarbin
181156de10 fix: prevent infinite reload loop in OAuth deep link handling and clean up comments in LoginView 2026-07-08 12:46:42 -04:00
Mohamad Tarbin
a038a3366f Merge pull request #130 from donetick/add-task-photo-fix
fix: update version codes and enhance document scanning functionality
2026-07-07 23:17:17 -04:00
Mohamad Tarbin
c43dc175d0 Merge branch 'develop' into feature/ja-localization 2026-07-07 23:01:46 -04:00
Mo Tarbin
fd3f7f4a37 fix: update version codes and enhance document scanning functionality 2026-07-07 21:16:30 -04:00
Mohamad Tarbin
20e5c0e292 Merge pull request #129 from donetick/fix-dependencies
chore: update iOS deployment target to 15.0 and upgrade dependencies
2026-07-07 11:22:19 -04:00
Mo Tarbin
768c639d2b chore: update iOS deployment target to 15.0 and upgrade dependencies 2026-07-07 11:21:58 -04:00
Mohamad Tarbin
9bd7f8347b Merge pull request #128 from donetick/ux-improvment-07-01-2026
Ux improvment 07 01 2026
2026-07-07 00:48:14 -04:00
Mohamad Tarbin
ae57022102 Merge pull request #127 from donetick/add-photo-ai
Add Support for OCR and attachment on tasks, redesign AddTaskModal
2026-07-07 00:25:35 -04:00
Mo Tarbin
12d95dd4b1 Fixes and remove logs 2026-07-07 00:23:36 -04:00
Mo Tarbin
57ac5cb9bf feat: enhance user profile photo handling with URL resolution and profile refresh 2026-07-06 18:12:23 -04:00
Mo Tarbin
24508be4d4 feat: implement attachment browser and viewer modals, enhance chore attachment handling 2026-07-06 18:11:57 -04:00
Mo Tarbin
9136ff3ea3 feat: enhance file upload and attachment management with draft support 2026-07-06 18:10:43 -04:00
Mo Tarbin
4460d80b72 Ability to have open OCR from the field 2026-07-04 15:22:24 -04:00
Mo Tarbin
eb8c178603 Add ability to move project from choreactionMenu
fix header not syncing on mychoreHeader
2026-07-04 12:00:12 -04:00
Mohamad Tarbin
ad08cfaad0 Merge pull request #126 from donetick/advance-filtering
Advance filtering
2026-07-04 02:25:31 -04:00
Mo Tarbin
96845ad7cf fix merge issue 2026-07-04 02:19:47 -04:00
Mohamad Tarbin
16412821bf Merge branch 'develop' into advance-filtering 2026-07-04 02:06:18 -04:00
Mo Tarbin
3c0f4402a8 add dependencies 2026-07-03 23:31:43 -04:00
Mo Tarbin
260087d1fa Add Ability to turnOCR photo then create task (Merge support-local-ai) 2026-07-03 23:31:19 -04:00
Mo Tarbin
3361ef949a Ability to open edit entry from HistoryDetailsModal 2026-07-03 15:45:15 -04:00
Mo Tarbin
dfe0e960dc Ability to open the modal for more details in actitityView 2026-07-03 14:56:44 -04:00
Mo Tarbin
98e0623cb7 Make sure the Activity view match with History Icons 2026-07-03 14:56:12 -04:00
Mo Tarbin
97084db4de Add HistoryDetailModal component for detailed activity view 2026-07-03 14:25:12 -04:00
Mo Tarbin
165c76bb69 feat: Implement advanced filtering in FilterBar and integrate ActiveFilterChips component
- Refactored FilterBar to utilize ActiveFilterChips for displaying active filters.
- Added selectable chip styles and improved hover effects for better UX.
- Enhanced filter handling with new props for managing active filters and results count.
- Introduced new hooks and state management for custom filters in MyChores and UserActivities.
- Updated ChoreToolbar to support new filter functionalities and improved UI components.
- Added client-side filtering capabilities in UserActivities with dynamic filter definitions.
2026-07-03 14:24:05 -04:00
Mo Tarbin
e0e4145481 Due date grouping show as timeline ( break by date not like smart groups) 2026-07-03 11:51:18 -04:00
Mo Tarbin
8c4e7e0e43 Center the text in the Quick filter chips 2026-07-03 11:49:27 -04:00
Mohamad Tarbin
dee41dad9e Merge pull request #125 from donetick/add-task-modal-v2
Add task modal v2
2026-07-03 02:01:33 -04:00
Mo Tarbin
47d596af08 feat: enhance DueDatePickerField with quick date and time selection options 2026-07-03 01:58:31 -04:00
Mo Tarbin
4019a7c225 feat: update AddTaskModal and SmartTaskTitleInput components for improved functionality and styling 2026-07-03 01:58:08 -04:00
Mo Tarbin
db0c199674 feat: refactor NotificationTemplate and remove unused components for cleaner code 2026-07-02 20:53:12 -04:00
Mo Tarbin
f11a1fd9cc feat: add DueDatePickerPreview component for managing due dates and times
feat: implement LabelsPickerField component for selecting multiple labels

feat: create NotificationPickerField component for managing notification reminders

feat: add PriorityPickerField component for selecting task priority levels

feat: implement ProjectPickerField component for selecting projects

feat: create RepeatPickerField component for setting up recurring tasks

feat: add RepeatPickerPreview component for displaying and selecting repeat options
2026-07-02 20:51:53 -04:00
Mo Tarbin
892754bbae feat: enhance error handling UI with detailed messages and copy functionality 2026-07-01 22:43:58 -04:00
Mohamad Tarbin
a0de0c2005 Merge pull request #111 from donetick/issue-108
Add MFA handling to AuthenticationLoading component
2026-06-30 01:52:57 -04:00
Mo Tarbin
6b5f5c54dd Add MFA handling to AuthenticationLoading component 2026-06-30 01:45:12 -04:00
Mohamad Tarbin
fdac632b1c Merge pull request #124 from donetick/bug-fixes-06-27-2026
Bug fixes 06 27 2026
2026-06-30 01:23:52 -04:00
Mo Tarbin
43f804c7a8 Fix: Export polling constants and synchronize retry intervals in SyncStatusIndicator 2026-06-30 01:21:17 -04:00
Mo Tarbin
e85220d727 Fix: Changing URL for backend requiring restart.
Fix: Add better feedback so user know if the url invalid or unreachable
2026-06-30 01:17:52 -04:00
Mo Tarbin
489d46e922 Fix : Display better login errors 2026-06-27 22:24:15 -04:00
Mo Tarbin
b2fdb049e2 Fix: update chore state handling on delete and archive actions
Response from backend just say sucessfull so we need to use the chore optimisitcally
2026-06-27 22:22:57 -04:00
Mo Tarbin
878031cae8 Fix: Make sure notification skip for achieve tasks
https://github.com/donetick/donetick/issues/695
2026-06-27 22:19:12 -04:00
Mohamad Tarbin
aeb0b90281 Merge pull request #116 from scottanderson/fix-assignee
fix: Set assignee bug
2026-06-23 00:19:25 -04:00
Mohamad Tarbin
83eb04eed3 Merge pull request #119 from scottanderson/anyone
Improve `anyone` UX
2026-06-22 23:27:03 -04:00
Scott Anderson
aeb3916741 Set anyone when everyone is deselected 2026-06-18 12:55:53 -04:00
Mohamad Tarbin
c42b0677d1 Merge pull request #104 from nicholasremm/feature/fix-oauth2-refresh-token
fix(mobile): Store refresh token when using OAuth2 provider
2026-06-17 20:32:49 -04:00
Scott Anderson
08f7e4900c Improve anyone UX 2026-06-17 04:45:00 -04:00
Mo Tarbin
8e5c31f7f3 remove the old filter logic and use advance filter in myChore 2026-06-14 15:55:19 -04:00
Mo Tarbin
23e777cd94 implement unified ChoreToolbar and enhance ChoreHistory with filtering options 2026-06-14 15:54:40 -04:00
Mo Tarbin
fe22bb1035 feat: enhance AdvancedFilterBuilder with new filtering options and UI improvements
- Introduced new filter options for due dates, points, and chore statuses.
- Refactored condition management to use selections for better state handling.
- Improved UI components for filter conditions, including chips for selection.
- Added a bottom sheet modal for filter creation and editing.
- Enhanced user experience with clear actions and previews for selected filters.
2026-06-12 21:31:17 -04:00
Mohamad Tarbin
0da9c7f965 Merge pull request #118 from donetick/capacitor-nfc-tag-scanner
add NFC capabilities for native apps
2026-06-07 16:36:24 -04:00
Mo Tarbin
48adb0b256 feat: update app version to 1.2.3, add NFC capabilities, and enhance deep link handling 2026-06-07 16:32:43 -04:00
Scott Anderson
b2eeeeddfb cleanup 2026-06-06 20:17:04 -04:00
Mohamad Tarbin
5ee2b6de48 Merge pull request #117 from donetick/offline-support-v2.3
Offline support v2.3
2026-06-06 14:14:05 -04:00
Mo Tarbin
4e0b5d79df feat: enhance offline support with improved network management and sync handling 2026-06-06 00:58:18 -04:00
Scott Anderson
027fac90b4 fix: Set assignee bug 2026-06-04 01:45:38 -04:00
Mo Tarbin
24118e0dc3 Chore create and update doesn't return useful other than id when we area creating. so we dismiss the value being returned 2026-05-31 19:04:04 -04:00
Mo Tarbin
34aa76504e add end-to-end testing setup with Playwright and initial test cases 2026-05-30 23:04:40 -04:00
Mohamad Tarbin
faf478a092 Merge pull request #114 from donetick/develop-rebased
Rebase Main with Develop
2026-05-30 22:10:55 -04:00
Mo Tarbin
f4a7b00b1b refactor: remove unused script tag for analytics from index.html 2026-05-30 22:10:23 -04:00
Mohamad Tarbin
df7680e06c Merge branch 'develop' into develop-rebased 2026-05-30 22:09:50 -04:00
Mo Tarbin
bbe68974b2 Refactor date parsing logic to validate word boundaries, preventing partial matches for days and months 2026-05-30 22:04:51 -04:00
Mo Tarbin
aad300bd9c Enhance due date parsing by validating word boundaries to prevent partial matches 2026-05-30 22:04:51 -04:00
Mo Tarbin
12ce568d3c refactor: update offline support notifications and confirmation messages for clarity 2026-05-30 22:04:51 -04:00
Mo Tarbin
25d3f76f9e feat: implement offline support for chore archiving and unarchiving, enhance state management for pending commands 2026-05-30 22:04:51 -04:00
Mo Tarbin
aece93d63d including improved command handling and sync status updates 2026-05-30 22:04:51 -04:00
Mo Tarbin
45e667abf7 add network listener management and enhance sync on reconnect functionality 2026-05-30 22:04:51 -04:00
Mo Tarbin
5869b39035 feat: enhance chore management with history and sync improvements
- Added support for starting and pausing chores with offline handling.
- Implemented chore history updates and deletions with pending command management.
- Enhanced sync engine to handle chore history changes and deletions.
- Introduced a PendingBadge component to display pending actions for chore history.
- Updated DeveloperSettings to include sync diagnostics and reset functionality.
- Improved user notifications for offline actions and pending commands.
- Refactored ChoreView to dynamically generate info cards based on chore history.
- Added sync status indicator with cancel all functionality for pending commands.
2026-05-30 22:04:51 -04:00
Mo Tarbin
d981d57a8f feat: implement offline support for labels and projects, enhance advanced settings with offline feature toggle, and add sync status indicator
- Added offline support for fetching and caching labels and projects using `offlineDB`.
- Enhanced `AdvancedSettings` to include an offline feature toggle with confirmation modal for disabling offline support.
- Introduced `SyncStatusIndicator` component to display sync status, pending commands, and failed commands.
- Created `PendingBadge` component to manage and display pending actions for synchronization.
- Removed deprecated offline mode toggle from `StorageSettings`.
- Improved error handling and user notifications for offline actions and sync processes.
2026-05-30 22:04:45 -04:00
Mo Tarbin
1f9d1edc5c Add status handling for 'Missed' and 'Rescheduled' activities in ActivityItem 2026-05-30 22:04:25 -04:00
Mohamad Tarbin
4944ee6078 Merge pull request #113 from donetick/donetick.com-clean
Rebase to Donetick.com branch
2026-05-30 21:55:57 -04:00
Mo Tarbin
c4b2b909e0 Squashed commit of the following:
Rebase from Donetick.com branch
commit 2a73d3240cab4b1624cc92e97cbf88d28ea97339
Merge: e6f7aa9 c6865f4
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Apr 14 13:16:01 2026 -0400

    Merge branch 'main' into donetick.com

commit e6f7aa98d1afdd63bca7172b647443edab72e0ec
Merge: f502dc4 4713e99
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Apr 7 00:43:25 2026 -0400

    Merge branch 'main' into donetick.com

commit f502dc4e76d6215a2ea4421ba9d4efd690087d14
Merge: 92ff8a5 1e122b3
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Apr 7 00:41:20 2026 -0400

    Merge branch 'main' into donetick.com

commit 92ff8a532c399b89e1bc9a747f7ee261bc2a3a75
Merge: 0297738 c87335f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Apr 7 00:05:24 2026 -0400

    Merge branch 'main' into donetick.com

commit 0297738c0648cc740cc6c5ece0744ac83a9309f6
Merge: e7df60c 12cba1f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Apr 5 23:41:46 2026 -0400

    Merge branch 'main' into donetick.com

commit e7df60c504594bb0079637ff5aef9c6fb24e30b4
Merge: 0a4c5ed 0b19cdc
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Mar 23 22:32:08 2026 -0400

    Merge branch 'main' into donetick.com

commit 0a4c5ed3870c20ed13c45e9caffd29d55aafcd5d
Merge: 4805cbb f483653
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Feb 16 18:30:25 2026 -0500

    Merge branch 'main' into donetick.com

commit 4805cbb8f7117f184aaaa35ae549a3433baee3d7
Merge: 96649ed 0b7d7bb
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Feb 14 17:01:26 2026 -0500

    Merge branch 'main' into donetick.com

commit 96649ed012028c8d55feb130f4c67f299522f5dc
Merge: a89f9b9 d8d7b6a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 23:22:08 2026 -0500

    Merge branch 'main' into donetick.com

commit a89f9b9525568775dba16464c61bce5ffe1c858b
Merge: 3550d23 1786a5e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 20:40:06 2026 -0500

    Merge branch 'main' into donetick.com

commit 3550d23639b0e8eea9e8449b1452a6e08617fb75
Merge: 160bd81 430e602
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 11:46:30 2026 -0500

    Merge branch 'main' into donetick.com

commit 160bd814bea4fea2c8c2ae9469ecddb8bbdefbc3
Merge: 68df100 4525aee
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 11:12:31 2026 -0500

    Merge branch 'main' into donetick.com

commit 68df100b63db2f8ce8169699cf8c757bc7c5fa86
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 11:08:58 2026 -0500

    chore: update version to 0.3.0 and add version bump scripts

    - Bumped version from 0.1.145 to 0.3.0 in package.json
    - Added npm scripts for version bumping: bump, bump:minor, and bump:major
    - Added capacitor-set-version dependency

commit 39fb8aeebc330bf22ab6015e119900dabe353238
Merge: 070abf9 a9cff1f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 10 01:24:01 2026 -0500

    Merge branch 'main' into donetick.com

commit 070abf9c81a6b450efe090811bf56d166087edf7
Merge: 2a11069 ef232ab
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Feb 9 23:31:36 2026 -0500

    Merge branch 'main' into donetick.com

commit 2a11069831cc780e82450a8ebdb6dc8b9e0aa7b9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 23:01:49 2026 -0500

    update API keys in configuration files for security and compliance

commit 216befc69ef9d13bba4ab2ddb8ce189f513109f8
Merge: 23f1d7e 7663a53
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 21:56:44 2026 -0500

    Merge branch 'main' into donetick.com

commit 23f1d7efe4fc38f7c3428dc8fc740e3b56c6d485
Merge: d5ab457 bec69b4
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 16:34:02 2026 -0500

    Merge branch 'main' into donetick.com

commit d5ab45789e946c16b89a95858c7173e96ed87316
Merge: fde04f2 666eb75
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 16:20:44 2026 -0500

    Merge branch 'main' into donetick.com

commit fde04f268052d765be65e78df7ba7937f99a1c8c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 11:17:01 2026 -0500

    fix: update version codes and names in output-metadata.json and Podfile.lock

commit 1aa592ccb2c3b79ae5751c09566280b5fedb50f7
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 11:10:27 2026 -0500

    fix: add missing newline at end of package.json

commit f9df5b27240ab6e038a11d25ff6d6adb39e2bb0b
Merge: 501f1a5 00e6cf5
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 10:30:07 2026 -0500

    Merge branch 'main' into donetick.com

commit 501f1a5ca3d405e34010a7e825e342bb1e7a1665
Merge: bed45a1 753d4cd
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 8 10:28:05 2026 -0500

    Merge branch 'main' into donetick.com

commit bed45a13a1a9780ac6ad9c64297730e1b7f22534
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Dec 29 15:34:20 2025 -0500

    chore: update Gradle distribution URL to version 8.12

commit a7a91fd1ebd0100f99770e1d8c5e5ebc4864c7e9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Dec 29 15:33:51 2025 -0500

    feat: update RevenueCat API key handling for iOS and Android in AccountSettings and Settings components

commit a2142b36365c0fc8d094adbde10746cd2a7ac6a0
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Dec 1 17:52:40 2025 -0500

    bump version code and name to 1.0.20 for Android and iOS

commit 215bb7d5c91afc2746275e85894b63515f2cdfd3
Merge: f0cb7d6 7cb2f20
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Dec 2 00:23:50 2025 -0500

    Merge branch 'main' into donetick.com

commit f0cb7d62ad7736bd3d49d0f4ff74ca147bf9d789
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Oct 3 00:56:48 2025 -0400

    chore: update version codes and dependencies for Android and iOS

commit 0ed061e7ad63fd406c5f4051e19dfaff719cb8e9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Oct 3 00:56:00 2025 -0400

    feat: add PRODUCT_BUNDLE_IDENTIFIER to project configuration

commit 9987813265bc808e37e0298e4463d52a71d7cfec
Merge: 0257074 04314d5
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Oct 3 00:44:16 2025 -0400

    Merge branch 'main' into donetick.com

commit 02570740ab1cd404bfc3c9d19539a7f67f94a317
Merge: 719708c 68f0912
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 28 19:33:12 2025 -0400

    Merge branch 'main' into donetick.com

commit 719708cd185da9791411299632ab940c7ca0b15a
Merge: 4ffaa75 ac2d491
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 28 19:31:22 2025 -0400

    Merge branch 'main' into donetick.com

commit 4ffaa75aea9b2a0f91e92594fbdef87763afd15e
Merge: 7e1deae 7658b4c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 28 02:46:53 2025 -0400

    Merge branch 'main' into donetick.com

commit 7e1deae9cf9c96253526fa03ee0bce42ca1e3f9d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Sep 27 13:35:06 2025 -0400

    chore: update project version to 1.0.18 and increment current project version to 18

commit ad041aeee88076793e23ce5da11f8e945d16e5d6
Merge: bb6a05a d28ecb5
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Sep 26 02:22:01 2025 -0400

    Merge branch 'main' into donetick.com

commit bb6a05a6b4c291333dc365824634ebbb92b57e6e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Sep 24 02:05:05 2025 -0400

    chore: update version codes and marketing version to 1.0.6 for Android and iOS builds

commit fac7225da9e509edb8735c3ec1e27e7861c9befd
Merge: 4aa17a0 fd6e488
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 21 13:06:56 2025 -0400

    Merge branch 'main' into donetick.com

commit 4aa17a0addfa6bd2b7d3012810d969cfda075ce2
Merge: bf4abea 79dfb11
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Sep 20 22:22:31 2025 -0400

    Merge branch 'main' into donetick.com

commit bf4abea73bc2f9cce732d6b2cd4b5fc8a59369e1
Merge: 7ed2a50 3bf9126
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Sep 20 19:08:51 2025 -0400

    Merge branch 'main' into donetick.com

commit 7ed2a50a6926249355a885d5f2c0d7339b15f3b1
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 18 01:09:50 2025 -0400

    Update google-service with fcm details. add support for push notification and push new version for the

commit 79017f91c6472656891ed5918fc12cad6182817f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Sep 15 23:58:13 2025 -0400

    refactor: remove unnecessary import statement in PrivacyPolicyView component

commit e40ea550f14a93d4fb275af8390f30a02ff3a52f
Merge: cba69af b71a533
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Sep 15 23:58:00 2025 -0400

    Merge branch 'main' into donetick.com

commit cba69af2856596c8e255211074094d96b0194e06
Merge: bf4e6aa 36093b9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 14 22:06:14 2025 -0400

    Merge branch 'main' into donetick.com

commit bf4e6aa3c90d6fca08d5ca6f3891b24fe68e73fb
Merge: ab0f603 bd14a35
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Sep 14 21:59:46 2025 -0400

    Merge branch 'main' into donetick.com

commit ab0f60320b5ed3673a56f8c5fbb4bd32c722f08e
Merge: 165bc07 219aa06
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 11 01:20:23 2025 -0400

    Merge branch 'main' into donetick.com

commit 165bc074a38239d4d2d5dc4326ced7794fbfc178
Merge: 70a8d3c b152da9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 09:17:56 2025 -0400

    Merge branch 'main' into donetick.com

commit 70a8d3cfd77ee1d9de66a373892486be1bc0510d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 03:09:28 2025 -0400

    fix: updated tablet installation section

commit ed1a35aa364f81c9f2aae14b3b342b5e1c2797e8
Merge: baabd4e 14ce230
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 03:01:58 2025 -0400

    Merge branch 'main' into donetick.com

commit baabd4e5b26cb2d849cc73c0ca12597d46f8b526
Merge: 3935b26 a65cb92
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 03:00:08 2025 -0400

    Merge branch 'main' into donetick.com

commit 3935b265cf78edcda2126eb133313482e087f2f4
Merge: b06cef2 4a54115
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 02:52:37 2025 -0400

    Merge branch 'main' into donetick.com

commit b06cef2c2b982f195c4d55485ec4b013361b8037
Merge: be0f64d 057c5f7
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Sep 4 01:49:49 2025 -0400

    Merge branch 'dev' into donetick.com
    ::# the commit.

commit be0f64d11ecb190e6999e03222f7f5d8d37d55e7
Merge: 480ee88 fd15235
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Sep 2 17:39:34 2025 -0400

    Merge branch 'main' into donetick.com

commit 480ee8818ad6406194b1c224445652f19dbf7cae
Merge: a225768 4e31190
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Aug 30 01:36:52 2025 -0400

    Merge branch 'main' into donetick.com

commit a225768e98639339df81b05699df50abde7d6e25
Merge: c251ee9 e99a066
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Aug 29 00:56:56 2025 -0400

    Merge branch 'main' into donetick.com

commit c251ee99a4e7c5852d5a798dd7fa473bce96da9f
Merge: be02a6d 6b5a874
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Aug 26 22:11:46 2025 -0400

    Merge branch 'main' into donetick.com

commit be02a6dca0958cec8bdfc408497dd999429caaf0
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Aug 26 17:53:43 2025 -0400

    Refactor ChoreCard: remove unused circle members data and update approval logic

commit d1e93c24e3bb917a2d26ad43ddc21a88cb9426e9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Aug 26 17:43:07 2025 -0400

    Add chore filtering by selected date and update navigation for localhost

commit d38e0c4ac7bdd790541a15eee471ad42afd01b34
Merge: 9098f9e defc7a8
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Aug 25 23:59:06 2025 -0400

    Merge branch 'main' into donetick.com

commit 9098f9e0304022fcbbb61f88cd79a5cf02489e0f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Aug 25 23:54:04 2025 -0400

    Remove unnecessary dependencies and clean up wrangler configuration

commit c51cc3a73c568200ee8905cb340ad85e201b7956
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Aug 25 23:51:04 2025 -0400

    Add wrangler configuration for Cloudflare Workers deployment

commit e7ec5f2b05312bdfe5297aefd3c19cf52b20f932
Merge: 2bfe42f 06d568e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Aug 25 23:42:23 2025 -0400

    Merge branch 'main' into donetick.com

commit 2bfe42f6f1729fc304a73a08d46a0b0969b1baaf
Merge: 6429fb8 6064c88
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Aug 25 23:40:58 2025 -0400

    Merge branch 'main' into donetick.com

commit 6429fb8aca1b2bfc9cb36c86d888c31e37182efd
Merge: 918a5fa 77b3430
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Aug 24 12:25:12 2025 -0400

    Merge branch 'main' into donetick.com

commit 918a5fa7e89ecb310c3f50352bbc900a383be8a2
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Aug 2 18:53:18 2025 -0400

    add RevenueCat API key to production environment variables

commit ef8d17cec88a5a3c7ba7ecdc0a793c104fc1fe55
Merge: 267de24 18743f6
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 29 00:12:33 2025 -0400

    Merge branch 'main' into donetick.com

commit 267de24b125e8754a0cab8997d10b9602886a27c
Merge: eefe3bb 63d1b86
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 20 10:41:56 2025 -0400

    Merge branch 'main' into donetick.com

commit eefe3bbbe99cdfb28eb335bec8a4afd763544068
Merge: a4c1187 1efab98
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 19 01:18:43 2025 -0400

    Merge branch 'main' into donetick.com

commit a4c1187c34a9cfbf944e05eab2af80a48642a230
Merge: ce3a97e e6400d8
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 19 00:56:06 2025 -0400

    Merge branch 'main' into donetick.com

commit ce3a97e8f43aad43ce3ee3d5664dc7f03ba6f69e
Merge: a3c4f1a 9d9c12a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 15 07:58:29 2025 -0400

    Merge branch 'main' into donetick.com

commit a3c4f1a6149fd84381cfd916e4f5ce2b59d63a30
Merge: b062f2f 0b57e42
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 14 02:06:27 2025 -0400

    Merge branch 'main' into donetick.com

commit b062f2f9152420a0d2c84ede1b49fd5f52ada432
Merge: fde32a4 8d9a3cb
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 13 01:33:50 2025 -0400

    Merge branch 'main' into donetick.com

commit fde32a4db4183019e9b4057f0c7bb983e61c644b
Merge: 011ed3c 9f2d0b5
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 13 01:31:04 2025 -0400

    Merge branch 'main' into donetick.com

commit 011ed3c89a5d5760d9d3bc22e963a140fd91397c
Merge: f6d4507 f6085aa
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 13 00:53:11 2025 -0400

    Merge branch 'main' into donetick.com

commit f6d45072b2894b967ac8b301f4d2c56297080f19
Merge: 76946d3 8a240d5
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 13 00:37:26 2025 -0400

    Merge branch 'main' into donetick.com

commit 76946d39daaf3e18805d745b1da0c4f478616c7e
Merge: 1ef7c49 c8d13a6
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 12 16:37:20 2025 -0400

    Merge branch 'main' into donetick.com

commit 1ef7c498cfa4a714ebe6baf07a85568a6832bc0c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 12 02:44:05 2025 -0400

    remove unnecessary whitespace and improve comments in StatusBarManager

commit 70e7864884c7aee3004c4b8b19518203bd4dcba5
Merge: dfc2ff5 b6fea7d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 12 02:43:26 2025 -0400

    Merge branch 'main' into donetick.com

commit dfc2ff5993e1471d99960dee6315b4838a952018
Merge: ff4ccfc 807dc61
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 12 02:20:06 2025 -0400

    Merge branch 'main' into donetick.com

commit ff4ccfcbb64307f2668155b2e327cd5b98bf7a3c
Merge: 7eace25 4576ddf
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 12 00:45:41 2025 -0400

    Merge branch 'main' into donetick.com

commit 7eace25ae9779becf349c490e88caa4a5fc84c6e
Merge: 8de5a78 3bab677
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jun 23 01:55:47 2025 -0400

    Merge branch 'main' into donetick.com

commit 8de5a787b31cbad2e09a7470f63a46d72f13bd03
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jun 23 01:46:44 2025 -0400

    fix: update Capacitor and CapgoCapacitorSocialLogin versions in Podfile.lock

commit 81480982210d213379c093efbc3523ce77fef5d6
Merge: c0d1071 ea70aa2
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jun 23 01:17:20 2025 -0400

    Merge branch 'main' into donetick.com

commit c0d1071cf9bd999e428d2786031ecbb0164668e7
Merge: 836d93a fe5a72a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jun 21 01:20:09 2025 -0400

    Merge branch 'main' into donetick.com

commit 836d93af08af34027098221df59ae906b17256aa
Merge: 8e97ee2 eaaeee6
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jun 21 01:01:09 2025 -0400

    Merge branch 'main' into donetick.com

commit 8e97ee2f516508a6910abca588ad514dd36a91a9
Merge: decf250 78b156d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 8 10:52:46 2025 -0400

    Merge branch 'donetick.com' of https://github.com/meauxt/donetick-frontend into donetick.com

commit 78b156d76e2cc739456fbe04b0debfc1d51042c5
Author: Mohamad Tarbin <mhed.t91@gmail.com>
Date:   Tue Jun 3 23:47:33 2025 -0400

    Dev (#5)

    * refactor: Update chore grouping and color constants for improved clarity and organization

    * refactor: Update due date display logic and fix performer ID reference in ChoreCard component

    * refactor: Rename parameter in CompleteSubTask back to completedAt to match backend https://github.com/donetick/donetick/issues/224

commit decf25006bf9fd6bafd086e0c15d0eef88af12d1
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 1 22:19:58 2025 -0400

    feat: Implement StatusBarManager and useStatusBar hook for theme-aware status bar handling

commit f58003b4ce2b1a77eef24b59126d5e329770e05c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 1 21:06:01 2025 -0400

    fix: Update CapgoCapacitorSocialLogin to version 7.6.3 and update Podfile.lock checksums

commit 6a13eef8e2167c9977b4a25cf09f2e236b986146
Merge: cd49d9a 6080b57
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 1 00:48:18 2025 -0400

    Merge branch 'main' into donetick.com

commit cd49d9a6a7ed2c91c9016c66002aad35cb9ab3d1
Merge: 4826090 ddf654a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 1 00:48:07 2025 -0400

    Merge branch 'dev' into donetick.com

commit 4826090a903c838e3c6a6a9c7843a2785600097a
Merge: 89196b0 bf8e187
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat May 31 19:40:43 2025 -0400

    Merge branch 'main' into donetick.com

commit 89196b0b3f0438387c69ba23de64822faf4596d5
Merge: 7919b00 87a0039
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat May 31 03:43:07 2025 -0400

    Merge branch 'main' into donetick.com

commit 7919b00cae6f6d77795b88f380ebde911b7c1a61
Merge: 54c9819 ee69009
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat May 31 01:44:39 2025 -0400

    Merge branch 'main' into donetick.com

commit 54c981997e055e1de46d08cf408b78ecf569233e
Merge: c3b54d0 a217740
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri May 16 21:18:11 2025 -0400

    Merge branch 'main' into donetick.com

commit c3b54d049aff67df2a0fd11a01ee44a6797ff7c7
Merge: 206302b de4dc9b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri May 16 20:48:22 2025 -0400

    Merge branch 'main' into donetick.com

commit 206302b2d2d4058a18457bb9bee45b1a6e13a65f
Merge: 56179a0 7ae2859
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri May 16 20:39:12 2025 -0400

    Merge branch 'main' into donetick.com

commit 56179a027f4510d3f5278fc649ecf1560d923aa1
Merge: 8980c06 e26f291
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 22:11:20 2025 -0400

    Merge branch 'main' into donetick.com

commit 8980c06554b2c2eeb95e8063830f2461c732b70a
Merge: f8812ca 0b1208a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 21:56:39 2025 -0400

    Merge branch 'main' into donetick.com

commit f8812cadee1547a9bf70ba8e35201bd68081c05d
Merge: 4eaa68b 261919f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 21:35:26 2025 -0400

    Merge branch 'main' into donetick.com

commit 4eaa68bf6e91f81b87ac8c70615a6e4373291ee0
Merge: c2544d9 66db280
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 19:52:10 2025 -0400

    Merge branch 'donetick.com' of https://github.com/meauxt/donetick-frontend into donetick.com

commit c2544d91e64e7d1f9db5c70fb12ce08bb0b76000
Merge: 6978288 f537a00
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 19:51:43 2025 -0400

    Merge branch 'main' into donetick.com

commit 66db28044faa1f88122d51d7e0646622025ef38f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 02:52:34 2025 -0400

    fix: update Capacitor dependencies and downgrade CocoaPods version

commit 697828837e28a0a553092f99684376a9fc181902
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 02:42:16 2025 -0400

    fix: update Java version to 21 and add new Capacitor dependencies

commit 3dc779fd15bbd7317be7e2bef0e741d21843341b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 02:37:13 2025 -0400

    fix: update Java version to 17 and add CapacitorCommunitySqlite and CapacitorNetwork dependencies

commit 6dbca55da82398a069d901bc3a85206fa47eae47
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 02:22:07 2025 -0400

    chore: update dependencies

commit 0c163d52aefb2065abc38718c3d842183aadc0e3
Merge: e08b80d f0e0c0e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Apr 24 02:00:03 2025 -0400

    Merge branch 'smart-text-field' into donetick.com

commit e08b80d625248a4917a03549d452530e2eadbd8a
Merge: b0b0bcc 1b53a4d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Mar 17 01:04:49 2025 -0400

    Merge branch 'main' into donetick.com

commit b0b0bcc4a9561ab829a3e55f4b344edf971bf5d6
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Mar 10 01:14:11 2025 -0400

    Update Podfile.lock and enhance Safe Area handling for Android platform

commit ff13ee112782bf963e892e8be36d95ed628b4d08
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Mar 10 00:34:28 2025 -0400

    Update Podfile.lock to reflect updated Capacitor dependencies and downgrade CocoaPods version

commit a7b756e1dbf6081c843457c31728fef3b1c6ec5f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Mar 10 00:34:12 2025 -0400

    Enhance Android configuration and improve Safe Area handling in NavBar and App components

commit aeab3560f6778712d8899a83497599b6f608b9eb
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Mar 8 23:51:43 2025 -0500

    Prevent NavBar from rendering on landing page in native platforms

commit 4972f554f53225636042f8e9bee19fa11e81893c
Merge: 7a7eb25 98b1cb6
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Mar 8 00:14:41 2025 -0500

    Merge branch 'capacitor7' into c7-donetick.com

commit 98b1cb6e8a25ebfff3fe7aacf421ffe56399c14e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Mar 6 17:39:06 2025 -0500

    Add iOS and Android assets; update dependencies and configurations

commit 7a7eb25f33d1f0c241221ece32a1842dbdddd57d
Merge: e369549 76ed927
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Mar 5 22:04:50 2025 -0500

    Merge branch 'main' into donetick.com

commit e36954960c803d5aab41a4b3549791a4c809b9a1
Merge: 4907e0a 52b81cc
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Mar 5 21:42:11 2025 -0500

    Merge branch 'main' into donetick.com

commit 4907e0af41cc2033c549bb9ef51124e582c963f0
Merge: 062bbbb ee566bd
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Mar 5 21:06:45 2025 -0500

    Merge branch 'main' into donetick.com

commit 062bbbb9137954eb1ef2b3ff101513659d6c68cd
Merge: ac6988c cd1b556
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Mar 5 20:56:11 2025 -0500

    Merge branch 'main' into donetick.com

commit ac6988c66c59d0fb0bc2982a6c20456448fce1ba
Merge: 2365b5e 6431e71
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 25 23:41:03 2025 -0500

    Merge branch 'main' into donetick.com

commit 2365b5e0895c34cd3f31fca032d652d2630bdea5
Merge: f064993 4734819
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Feb 15 00:06:31 2025 -0500

    Merge branch 'main' into donetick.com

commit f0649931825e2812da508e75d80f275854461e53
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Feb 15 00:04:59 2025 -0500

    Fix https://github.com/donetick/donetick/issues/128

commit d98a324a890318dca2cf4fb371fd83b99830d602
Merge: d36a428 5c82fe4
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Feb 12 22:27:36 2025 -0500

    Merge branch 'donetick.com' of https://github.com/meauxt/donetick-frontend into donetick.com

commit d36a42871e98bc94f5c56634859325a561727c15
Merge: b35f518 c06d5f1
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Feb 12 22:27:19 2025 -0500

    Merge branch 'main' into donetick.com

commit 5c82fe4c3f07ee0faefd7c1ac90b4c419df33c23
Merge: b5a0076 5bf0724
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Feb 12 00:32:16 2025 -0500

    Merge branch 'main' into donetick.com

commit b5a00763d75d6c599520250bcd511b17317fd8b9
Merge: c6e1f9c 2925267
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 11 21:01:01 2025 -0500

    Merge branch 'main' into donetick.com

commit c6e1f9c935d9654d1fd0e6cb802f9eb9934f65c0
Merge: 6e3f223 cfc121b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 11 20:50:47 2025 -0500

    Merge branch 'main' into donetick.com

commit 6e3f223c6ce83690466c31de38d918698424efd8
Merge: d2beee5 e964985
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Feb 11 20:49:26 2025 -0500

    Merge branch 'main' into donetick.com

commit d2beee52a1a954b63902abc596b25e97447a3c54
Merge: b35f518 06519a0
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Feb 7 00:42:16 2025 -0500

    Merge branch 'main' into donetick.com

commit b35f518b4e6e40b4e6b0c6f360ad258bd50a689e
Merge: c4121db b221f38
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 2 20:48:54 2025 -0500

    Merge branch 'dev' into donetick.com

commit c4121dbae1c16cb7def7c07bafccc98c6255d1b4
Merge: 8cc6789 568f86a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Feb 2 01:27:53 2025 -0500

    Merge branch 'dev' into donetick.com

commit 8cc678955bd0a8f1846a17ee8dc2c7597c62cdf0
Merge: 279bf05 4527b22
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jan 21 15:24:34 2025 -0500

    Merge branch 'dev' into donetick.com

commit 279bf059c4ca2034802872f0b49eea0d73f8e7fd
Merge: 8c0ccc9 4e64d0b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jan 18 09:54:24 2025 -0500

    Merge branch 'dev' into donetick.com

commit 8c0ccc9d2cd1cbf101ef672134ad8980f4e7cd65
Merge: 629c1ce 9dc3edb
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Jan 17 00:50:46 2025 -0500

    Merge branch 'dev' into donetick.com

commit 629c1cee0b9b591f6c33b23e557af079837f9b4e
Merge: 5adeae6 56f66e9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Jan 16 01:02:14 2025 -0500

    Add useDebounce hook for debouncing input value
    s# Please enter a commit message to explain why this merge is necessary,

commit 5adeae661b402280f1f0b84e1416f3ffbfcb3410
Merge: 7309161 aa7f412
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Jan 15 02:05:10 2025 -0500

    Merge branch 'dev' into donetick.com

commit 73091615cb21faca1325fad6bb10aa126de297aa
Merge: f6d86a9 da85caf
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Jan 15 01:55:13 2025 -0500

    Add IconButtonWithMenu component with label support
    Add LearnMoreButton with some instruction on task modal# Please enter a commit message to explain why this merge is necessary,

commit f6d86a92d92a5cf0b78c3505fc0b4de9917a8913
Merge: 89824a4 d3b3623
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jan 14 11:08:22 2025 -0500

    Make sure the title respect upper and lower case

commit 89824a4ce0f374b0f41943d0c2b4d11bd234cc85
Merge: 9110bf6 cc11a62
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jan 14 10:47:13 2025 -0500

    Experiment: Add Sidepanel with calendar view
    Support redeem points
    Experiment: task in sentences
    Fix small bugs in the chip when loading the chore card

commit 9110bf6de4a1a234dbd73afc19f78e4378816cc4
Merge: 4879b86 46f7f51
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Jan 10 00:38:38 2025 -0500

    Update Login URL

commit 4879b86e49525da56de3f95d386711cc2013a5e2
Merge: f8d3312 13bfe66
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Jan 3 02:12:21 2025 -0500

    Update API URLs to include version number

commit f8d3312ee7f333c190526b90e2e1534a9ab88379
Merge: 92513aa 1b1da5f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Dec 31 02:23:06 2024 -0500

    Merge branch 'dev' into donetick.com

commit 92513aafaee2ed5135f022c57354ee63160a4f38
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Dec 29 00:31:10 2024 -0500

    chore: Remove unused import and fix typo in LabelView.jsx

commit aafc3c412db13f01b467df8180231fd58e2fd14d
Merge: 8183792 d4c36e2
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Dec 28 18:53:53 2024 -0500

    Initial Activity View
    Add New Colors.jsx
    Allow Dark model Toggle from the Navbar

commit 818379211ccde58532242aba17b6a88696df43ac
Merge: 7bdc09d 0f2781f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 19:06:20 2024 -0500

    Merge branch 'dev' into donetick.com

commit 7bdc09db7368d022c2552f1721d3fa3b52e8a795
Merge: 08955e3 577791b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 18:44:32 2024 -0500

    Merge branch 'main' into donetick.com

commit 08955e325e300411ebb113f80ef5be7e9898ecf5
Merge: f812ada 6085ffa
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 18:28:20 2024 -0500

    Merge branch 'donetick.com' of https://github.com/meauxt/donetick-frontend into donetick.com

commit f812ada34938998d1a1cd4c00405b96edd7d219b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 18:22:15 2024 -0500

    Update npm dependency to latest stable version

commit bda85c8f90fd616deee9594b64cc02bb60af7d7c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 18:21:46 2024 -0500

    Update API_URL in Config.js to use window.location.hostname for 'AUTO' value

commit 1bda13166c569f0d726e3d40eb15e4ec3784188e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:39:16 2024 -0500

    feat: Set maximum file size to cache in service worker configuration

commit 6085ffa7e11844876cfdf3617c6efdd6ee741cbf
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:37:19 2024 -0500

    Update Vite configuration to set maximum cache file size and remove unused Rollup external dependencies

commit 2d7ff4550e6f80529d11f4f7bf308873511b6a63
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:32:06 2024 -0500

    Fix formatting in Vite configuration file

commit 47571fe092c915119ed700e437f616377f86e815
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:30:56 2024 -0500

    Add external dependency configuration for Rollup in Vite build

commit 528faaf46cf780c0ce04a9380283a3a2d11825aa
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:25:02 2024 -0500

    Remove unnecessary 'dev' flags from package-lock.json dependencies

commit 7d01541aecbe059f22c0c108b2baf81012eb3b36
Author: Mohamad Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:21:36 2024 -0500

    Mobile app (#3) (#4)

    * Initial Capacitor Config and plugins

    * Add Android project files and resources

    * Add local notification scheduling for chores

    * Add NotificationAccessSnackbar component for handling notification preferences

    * Add capacitor-preferences to Android project

    * Update notification Snackbar

    * Add local notification scheduling for chores

    * Add ionic.config.json file for custom project configuration

    * chore: Add environment variables for production deployment

    * Add Support for IOS, pass notificaiton token(push notifications)

    * Add Capacitor Device support and refactor notification handling

    * Refactor GoogleAuth client IDs to use environment variables

    * Remove google-services.json to enhance security by eliminating sensitive data from the repository

    * Remove environment files to enhance security by eliminating sensitive data from the repository

    * Rename project from fe-template to Donetick in ionic.config.json

    * Remove GoogleService-Info.plist and Info.plist to enhance security by eliminating sensitive data from the repository

    ---------

    Co-authored-by: Mo Tarbin <mohamad@Mos-MacBook-Pro.local>

commit 4aa4528b565560a6a91b9e2a9bdeda11dba7c2cf
Merge: bcd32a8 5d1f381
Author: Mohamad Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:18:13 2024 -0500

    Merge branch 'donetick.com' into dev

commit 5d1f3811c65445cae702660023bb449a8e221a53
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:09:04 2024 -0500

    Add Info.plist configuration for iOS app

commit 903e8c3f1ec3e12041c9382936fcd16de7918d81
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 02:08:28 2024 -0500

    Add Google services configuration for iOS app

commit 592a43a85c8540978c6b85d4a3bd01a643f607cc
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 01:40:17 2024 -0500

    Add Google services configuration for Android app

commit 6ed89f0d085812364af0fd249e5c867a6e7b446d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Dec 26 01:20:30 2024 -0500

    Add Android and iOS client IDs to production environment variables

commit a941263debcac8205ca828ee643c2a4dafa4d7ce
Merge: 385d923 1e7b47e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Dec 22 16:07:18 2024 -0500

    Merge branch 'dev' into donetick.com

commit 385d92316ab6c4b20569a6d0e4f1fa2d5228c0b3
Merge: 22abf46 88c11ee
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Dec 15 18:11:00 2024 -0500

    Fix Unable to assign Assignee to task
    Support Loading  archived

commit 22abf462f041384559fa9808a24d308c40bf1fba
Merge: 08ccd89 7ea0a03
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Dec 14 02:15:21 2024 -0500

    Support Sortinging in My Chore by Date
    Show API Token and allow manual copy
    Show Error when sign up disabled
    Support Pushover

commit 08ccd891b115a599eb907d859a0129695baf5f01
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Dec 7 15:26:11 2024 -0500

    Update VITE_APP_API_URL in .env.production

commit 874898be4a13d5f16512f469c57cab2e4f9d4d46
Merge: 0994f3a f8639be
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Dec 6 01:30:41 2024 -0500

    Merge branch 'dev' into donetick.com

commit 0994f3a0d3c05a2515084e455e950773526f3243
Merge: 7205a64 57b2ea1
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Nov 30 02:15:54 2024 -0500

    Merge branch 'main' into donetick.com

commit 7205a647677df61fa26b4428bac34e2d468defe1
Merge: 2514205 ba75962
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Nov 30 00:46:06 2024 -0500

    Add Label filters, Update cohre card to show labels, fix typo

commit 2514205e342e7196b8cd6ed8bbcdc2e53eca8889
Merge: f5d157d 7551871
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Nov 24 00:50:00 2024 -0500

    Merge branch 'dev' into donetick.com

commit f5d157d1758a92ec38fe89e894e5ef58af204ec6
Merge: b9b0d28 43608a3
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Nov 23 21:42:52 2024 -0500

    Merge branch 'dev' into donetick.com

commit b9b0d28a18affcbccf6b0b02401d6ee65ce62f22
Merge: d80311a 7c36e2d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Nov 23 20:26:14 2024 -0500

    Add Support for LabelV2, Add LabelModal and LabelView.
    Add React Query

commit d80311ac956412f8a22d43cab445d4c928201048
Merge: 5954dfc 2ad8ddd
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Nov 4 00:23:13 2024 -0500

    Fix Monthly text

commit 5954dfcf500a88b7a2ec5c7004b545febf4327c2
Merge: 1925822 e1615d2
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Nov 3 22:59:43 2024 -0500

    Merge branch 'dev' into donetick.com

commit 1925822192ff22de00a76fc2fafa6dfd174c8406
Merge: 7465158 1e90c2e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Nov 3 22:40:43 2024 -0500

    Update the version

commit 7465158b033a330ea9d933d787f03779ba754abe
Merge: 5a16acf ee5763b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Nov 3 22:38:02 2024 -0500

    Add Support for Priority

commit 5a16acf403e5d0fd173f411f91ddbfc8b15e9168
Merge: d85776d 2406331
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Sep 6 18:05:54 2024 -0400

    Add CookiePermissionSnackbar
    Update landing

commit d85776d8fd9cb8a007128ad49a87a3da941e9295
Merge: 78c8bb7 7e93e80
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Aug 10 02:31:27 2024 -0400

    Merge branch 'dev' into donetick.com

commit 78c8bb7a873ea6c596855a785a20f360724d15f4
Merge: fb93f4e ea4783f
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Aug 10 02:29:35 2024 -0400

    Merge branch 'dev' into donetick.com

commit fb93f4e705b2988cd21194be28eceb9e8bae27df
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Aug 4 22:36:22 2024 -0400

    chore: Add support for Open Replay

commit dc9760960c2dbfe04ab0abe182493dc702ebc788
Merge: f003eca b5f17dc
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Aug 4 22:35:12 2024 -0400

    Add support for Open Replay

commit f003eca86b664564c0519415898456e28765f5db
Merge: eeb0e20 539cf5c
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 29 12:46:40 2024 -0400

    Merge branch 'dev' into donetick.com

commit eeb0e209a3cb175fc63d1d0894f6d0c1039183a8
Merge: 65fd025 8e0c467
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 29 12:10:31 2024 -0400

    Merge branch 'dev' into donetick.com

commit 65fd025b26cef1cdb632732b5ef1656df10fe9bc
Merge: 098c2bd ff745e9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 29 12:03:43 2024 -0400

    Merge branch 'dev' into donetick.com

commit 098c2bde3755d97f6eb3585bbce6b9766f313987
Merge: 65a6eae 0df5162
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 29 12:00:49 2024 -0400

    Merge branch 'dev' into donetick.com

commit 65a6eae42ea00ec0c1e043f0d3580f7bbcfa12ad
Merge: f676bf0 b7ee1c0
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 29 02:55:28 2024 -0400

    Merge branch 'dev' into donetick.com

commit f676bf0aaa356b4a414199b364787e36bd757c23
Merge: f365635 90efb5b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 20 03:40:53 2024 -0400

    Merge branch 'dev' into donetick.com

commit f3656353cd95276b23d9f7aba0f177ee4d81a89e
Merge: 3036eb4 aed179d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Jul 18 18:20:23 2024 -0400

    Merge branch 'dev' into donetick.com

commit 3036eb443a0ff8b09d4a33c4c6842082ab6edad9
Merge: e2dff21 7991399
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Thu Jul 18 18:06:56 2024 -0400

    Merge branch 'dev' into donetick.com

commit e2dff2197c5a49e97fd9f8150d336fdd5b11afb3
Merge: c292335 dfe89b4
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Wed Jul 17 01:08:35 2024 -0400

    Merge branch 'dev' into donetick.com

commit c292335e95e7aa01ab0960ac4e1c080ceeda1379
Merge: 9602842 7f4e592
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 16 19:37:32 2024 -0400

    Merge branch 'dev' into donetick.com

commit 9602842008a9cb76022640b370e941208f08305d
Merge: 9cba371 93512eb
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 16 01:59:02 2024 -0400

    Merge branch 'dev' into donetick.com

commit 9cba371fd526f2a52dcef83d20e463c446852e1d
Merge: ef6c184 7a49011
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 14 17:56:25 2024 -0400

    Merge branch 'dev' into donetick.com

commit ef6c1841fe4c4ebffca920779f04f8c92b18ffe6
Merge: 78299ee bc741d9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 14 17:45:41 2024 -0400

    Merge branch 'd`ev' into donetick.com

commit 78299ee953418059c84b4b9ea53ffe01129a28fc
Merge: bcc82f9 ba3331e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 13 01:54:35 2024 -0400

    Merge branch 'dev' into donetick.com

commit bcc82f9b524a484a41ac4470d123c565aafd9ce8
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 9 21:22:32 2024 -0400

    Add VITE_IS_LANDING_DEFAULT flag for conditional rendering of landing page

commit 48d664e15704811c60d125370e5bd80ecf6cfb8b
Merge: 8f670c6 e25a6d3
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 9 21:21:43 2024 -0400

    Merge branch 'dev' into donetick.com

commit 8f670c60bf8df7e060b8a963b5a107e6f59e3b93
Merge: 851c330 8da220e
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 9 17:51:09 2024 -0400

    Merge branch 'dev' into donetick.com

commit 851c33035c8a0431d36524a300b5fd3b399238ce
Merge: 5a60894 40f1384
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 9 17:41:23 2024 -0400

    Update landing Merge branch 'dev' into donetick.com

commit 5a6089465391825c9b0278e2dc330aff8167ae36
Merge: 499da8f c4bf06b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 7 19:49:37 2024 -0400

    Merge branch 'dev' into donetick.com

commit 499da8f995ea10ae4a488e2b83505460a925de8d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 7 03:19:03 2024 -0400

    Squashed commit of the following:
        Trim first character from emoji name in ChoreCard component

commit d031363dae6789b2ea8bd0cd770ccdeb98bdb7d7
Merge: a725dc2 09a4bbd
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 7 02:50:39 2024 -0400

    Merge branch 'dev' into donetick.com

commit a725dc2d5f22575bbdadc278b986e8575ee74a97
Merge: 468f282 8a919dd
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 7 02:14:02 2024 -0400

    Merge branch 'dev' into donetick.com

commit 468f282f2e2cb5bb73c8542d8135b2cdf3981d80
Merge: 47f8218 e039b73
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jul 7 00:25:27 2024 -0400

    Merge branch 'dev' into donetick.com

commit 47f82188a4fbba5bffcf1d50bde30e19c10354e3
Merge: dd5f61a 4f9e2f9
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 6 13:24:57 2024 -0400

    Merge branch 'dev' into donetick.com

commit dd5f61a3c13f528275dedf0af4dbe8aa5923b990
Merge: 203846b ae96328
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 6 03:50:05 2024 -0400

    Merge branch 'dev' into donetick.com

commit 203846ba3220732ec619f39cb9ea60e999a6115e
Merge: 7f86704 09c25ce
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sat Jul 6 02:35:20 2024 -0400

    Merge branch 'dev' into donetick.com

commit 7f8670439b044eb38acfa5bfa036166c647d5b15
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Jul 5 17:30:47 2024 -0400

    refactor: Simplify API_URL assignment in Config.js

commit 24d9db8d580224574d6c468150b638c9e29f2528
Merge: 6232455 c34da50
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Fri Jul 5 17:29:45 2024 -0400

    Merge branch 'dev' into donetick.com

commit 6232455f30692e6e6ca8351049d6985b158cf9fe
Merge: 6da9c29 c5ee02d
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Tue Jul 2 00:49:58 2024 -0400

    Merge branch 'dev' into donetick.com

commit 6da9c2966b2ba5b168844a2961f169e188bafa84
Merge: 0b90929 61b4e4b
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 1 23:54:30 2024 -0400

    Merge branch 'dev' into donetick.com

commit 0b909292d6c033662ef8a6591dd8d665611d88ab
Merge: 4546728 5e54da8
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 1 22:13:01 2024 -0400

    Merge branch 'dev' into donetick.com

commit 45467286b27fc7dd9cbb05947d7db2ca81312da0
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Mon Jul 1 01:52:00 2024 -0400

    add the .env.development file

commit 73a458b740cc81376ef3d28e80ac931865d2af0a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 30 23:08:23 2024 -0400

    navigate app always to my/chores

commit 44aeb03c53c30ac5644461bc45e0d8c49b01911a
Author: Mo Tarbin <mhed.t91@gmail.com>
Date:   Sun Jun 30 22:46:55 2024 -0400

    Add production environment variables for API URL, redirect URL, and Google Client ID
2026-05-30 21:50:16 -04:00
tanomitsu
08f3928ebc feat: add Japanese (ja) localization
- Add ja translations for common, settings, and chores namespaces
- Register ja in AVAILABLE_LANGUAGES so it appears in the language picker
- Import moment/locale/ja so date and relative-time formatting uses Japanese
2026-05-26 15:28:29 +09:00
Mohamad Tarbin
350c177be8 Merge pull request #109 from donetick/improve-parser-logic
Enhance due date parsing by validating word boundaries
2026-05-26 01:07:56 -04:00
Mohamad Tarbin
d3103cb966 Merge pull request #110 from donetick/offline-support-v2.2
Implement offline support for chore archiving and unarchiving
2026-05-26 01:07:38 -04:00
Mo Tarbin
eec3721e9d refactor: update offline support notifications and confirmation messages for clarity 2026-05-26 00:02:10 -04:00
Mo Tarbin
8058f8f376 feat: implement offline support for chore archiving and unarchiving, enhance state management for pending commands 2026-05-25 16:51:34 -04:00
Mo Tarbin
eae67fd482 Refactor date parsing logic to validate word boundaries, preventing partial matches for days and months 2026-05-25 16:47:05 -04:00
Mo Tarbin
d10727b87d Enhance due date parsing by validating word boundaries to prevent partial matches 2026-05-25 12:46:18 -04:00
Mohamad Tarbin
52d6dc9376 Merge pull request #106 from Paccoco/fix/android-custom-server-url-init
fix: reinitialize api client after server URL changes
2026-05-25 02:01:02 -04:00
Mohamad Tarbin
6ff38e8068 Merge pull request #90 from felipellc/add-pt-br-translation
feature/add-ptbr-support
2026-05-25 01:59:06 -04:00
Mohamad Tarbin
b54f4a846c Merge pull request #99 from donetick/offline-support-v2
Offline support v2
2026-05-25 01:57:27 -04:00
Mo Tarbin
b69fa34b9f including improved command handling and sync status updates 2026-05-25 01:56:14 -04:00
Mohamad Tarbin
e1f050ac7e Merge pull request #107 from donetick/fix-activity-car
Add status handling for 'Missed' and 'Rescheduled' activities in Acti…
2026-05-25 01:48:21 -04:00
Mo Tarbin
76668b65fc Add status handling for 'Missed' and 'Rescheduled' activities in ActivityItem 2026-05-24 01:54:56 -04:00
Paccoco
7524cc31c1 fix: reinitialize api client after server URL changes 2026-05-24 01:53:14 +00:00
nick
a7f832107d Use common storage function to save access and refresh tokens 2026-05-17 19:49:08 +00:00
Mohamad Tarbin
674b0d7285 Merge pull request #101 from MindStudioOfficial/fix/points-members-history-v2
[reopen] fix: points history to include circle members [for donetick/donetick#362]
2026-05-16 22:42:12 -04:00
Mo Tarbin
d618a09f6d add network listener management and enhance sync on reconnect functionality 2026-05-16 19:33:07 -04:00
Marc Julien Bach
995b1fe63c Fix points history to include circle members 2026-05-16 16:06:09 +02:00
Mohamad Tarbin
6200f4f790 Merge pull request #100 from donetick/revert-93-fix/points-members-history
Revert "fix: points history to include circle members [for donetick/donetick#362]"
2026-05-16 00:46:10 -04:00
Mohamad Tarbin
a16c312292 Revert "fix: points history to include circle members [for donetick/donetick#362]" 2026-05-16 00:45:51 -04:00
Mohamad Tarbin
1d907bc2d4 Merge pull request #93 from MindStudioOfficial/fix/points-members-history
fix: points history to include circle members [for donetick/donetick#362]
2026-05-16 00:45:44 -04:00
Mohamad Tarbin
d267ba4cde Merge pull request #94 from tinect/feat/germanTranslation
feat: add German translation
2026-05-12 01:25:09 -04:00
Mo Tarbin
07c31ebde1 feat: enhance chore management with history and sync improvements
- Added support for starting and pausing chores with offline handling.
- Implemented chore history updates and deletions with pending command management.
- Enhanced sync engine to handle chore history changes and deletions.
- Introduced a PendingBadge component to display pending actions for chore history.
- Updated DeveloperSettings to include sync diagnostics and reset functionality.
- Improved user notifications for offline actions and pending commands.
- Refactored ChoreView to dynamically generate info cards based on chore history.
- Added sync status indicator with cancel all functionality for pending commands.
2026-05-12 01:10:49 -04:00
Mo Tarbin
2c353628a3 feat: implement offline support for labels and projects, enhance advanced settings with offline feature toggle, and add sync status indicator
- Added offline support for fetching and caching labels and projects using `offlineDB`.
- Enhanced `AdvancedSettings` to include an offline feature toggle with confirmation modal for disabling offline support.
- Introduced `SyncStatusIndicator` component to display sync status, pending commands, and failed commands.
- Created `PendingBadge` component to manage and display pending actions for synchronization.
- Removed deprecated offline mode toggle from `StorageSettings`.
- Improved error handling and user notifications for offline actions and sync processes.
2026-05-11 17:27:29 -04:00
Mohamad Tarbin
3d170d88fb Merge pull request #88 from hoborm/bugfix/filters-hide-grouping
Add support for grouping to custom filtered chores
2026-05-03 21:30:38 -07:00
Mohamad Tarbin
90171b2ebd Merge pull request #89 from hoborm/bugfix/filters-and-chips-navigation-hamburger
Navigation of filters and chips is now in place instead of navigation to a new site in PWA.
2026-05-03 21:27:01 -07:00
tinect
36298893db feat: rename “Lokalisierung” to “Sprach- und Formateinstellungen”; keep “Things” untranslated 2026-04-21 09:07:06 +02:00
tinect
ca7d71eed4 feat: add German translation 2026-04-20 21:24:59 +02:00
Marc Julien Bach
d0e2771a2f Fix points history to include circle members 2026-04-18 04:39:28 +02:00
Felipe Camargo
6b80bc5b5e Rename pt-BR locale to pt to match project convention
All existing locales use two-letter codes (ar, en, es, fr, nl) and the
crowdin.yml output path uses %two_letters_code% — using pt-BR would
conflict with any future Crowdin-imported Portuguese.

The display name stays 'Portuguese (Brazil)' / 'Português (Brasil)' so
users still see it's the Brazilian dialect.
2026-04-13 08:08:38 -07:00
Felipe Camargo
016a613fd5 Add Brazilian Portuguese (pt-BR) translation
Adds public/locales/pt-BR/ with complete translations for common,
chores, and settings namespaces. Registers pt-BR in the
AVAILABLE_LANGUAGES picker in LocalizationContext.jsx.

Tone: informal 'você' form, natural Brazilian Portuguese.
2026-04-13 07:49:34 -07:00
Mo Tarbin
c6865f48f5 Merge branch 'main' of https://github.com/Donetick/frontend 2026-04-12 14:09:01 -04:00
Mo Tarbin
3935bd67f8 Sort months in recurrent chip text for consistent display 2026-04-12 14:08:45 -04:00
Mohamad Tarbin
917993a4fa Merge pull request #87 from hoborm/bugfix/filters-settings-icon-misaligned
Add 32px height for filter chip, align cogwheel with filters
2026-04-12 14:02:46 -04:00
Mihaly Hobor
1d807002f8 Navigation of filters and chips is now in place instead of navigation to a new site in PWA. 2026-04-09 02:56:38 +02:00
Mihaly Hobor
f95e1138a0 Add support for grouping to custom filtered chores 2026-04-09 02:45:57 +02:00
Mihaly Hobor
1d16d74383 Add 32px height for filter list, align cogwheel with filters 2026-04-09 01:35:49 +02:00
Mo Tarbin
4713e99c7b Bump version to 1.2.2 and update project version codes 2026-04-07 00:43:08 -04:00
Mo Tarbin
1e122b36a3 Merge branch 'main' of https://github.com/Donetick/frontend 2026-04-07 00:37:29 -04:00
Mo Tarbin
c87335ff56 Bump version to 1.2.1 and update project version codes 2026-04-07 00:05:02 -04:00
Mohamad Tarbin
b8dd0e2fb1 Merge pull request #73 from donetick/feature/internationalization-support
Feature/internationalization support
2026-04-06 21:29:31 -04:00
Mohamad Tarbin
3a754d5703 Merge pull request #85 from gitbreaker222/patch-1
UX / SECURITY: Update placeholder text for displayName input
2026-04-06 21:17:42 -04:00
gitbreaker222
e39fa172cb Update placeholder text for displayName input
Currently new users are asked to put their pw into the displayName input --> reveiling credentials!!
2026-04-06 18:39:43 +02:00
Mohamad Tarbin
8c0d2b67e4 Merge branch 'main' into feature/internationalization-support 2026-04-05 20:51:29 -04:00
Mohamad Tarbin
12cba1f8fb Merge pull request #81 from hoborm/bugfix/complete-chore-reappear-issue
Chore hides then reappears after completion
2026-04-05 20:49:09 -04:00
Mohamad Tarbin
bf5ae30bda Merge pull request #83 from donetick/04052026-fixes
bug fixes
2026-04-05 20:43:50 -04:00
Mo Tarbin
2973b47555 User Activities to support note viewing functionality 2026-04-05 20:41:16 -04:00
Mo Tarbin
65cba31306 Update due date handling to treat 23:59:59 as end-of-day and adjust parsing logic for unspecified times 2026-04-05 20:27:07 -04:00
Mo Tarbin
629920c2b3 Description not being send with TaskinSentence 2026-04-05 20:26:51 -04:00
Mo Tarbin
e0f00fd4f5 Enhance AddTaskModal to support custom due times and update due date handling 2026-04-05 18:44:41 -04:00
Mo Tarbin
083680b563 ChoreHistoryItem to improve status icon handling and update date parsing logic to match choreHistory card 2026-04-05 18:27:37 -04:00
Mo Tarbin
9a637c484b fix issue if we use Reset Filter showing task across project instead of default only 2026-04-05 18:27:07 -04:00
Mo Tarbin
175ef04c70 Fix SmartTaskTitleInput to set text color to transparent for better visibility in dark mode 2026-04-05 18:25:55 -04:00
Mihály Hóbor
1d11f8316c Fix the issue where the chore reappears after completion then becomes hidden again. 2026-04-04 01:06:18 +02:00
Mohamad Tarbin
bb8027d663 Merge pull request #64 from feedingaliencat/chores-filter-available-for-me
Chores filter: Add filter for "Assigned to me or not assigned"
2026-04-02 23:56:24 -04:00
Mohamad Tarbin
bfa5c66006 Merge pull request #79 from hoborm/bugfix/rework-create-chore-notification-input-v2
Fix issue where cannot delete input field before input
2026-04-02 23:54:25 -04:00
Mihály Hóbor
0a606f6d23 Fix issue where cannot delete input field before input 2026-04-02 16:08:59 +02:00
emilio
e4611508ca Merge pull request #1 from hoborm/patch-1
Update label for quick filter to 'Available for me'
2026-04-01 12:14:01 +02:00
Mihaly Hobor
3a8ac8298d Update label for quick filter to 'Available for me' 2026-03-31 00:45:05 +02:00
Mohamad Tarbin
6ab6d0d205 Merge pull request #63 from feedingaliencat/readme-point-to-backend-docs
README: Point to the full documentation in backend
2026-03-30 01:19:38 -04:00
Mohamad Tarbin
30d398f5f1 Merge pull request #69 from hoborm/bugfix/deleted-task-view-no-update
Fix chore list view doesn't update when chore is deleted.
2026-03-30 01:09:48 -04:00
Mohamad Tarbin
85de7d08fd Merge pull request #74 from feedingaliencat/588-chores-starting-with-digit
ChoreCard: Fix rendering of chores names starting with a digit
2026-03-30 01:08:57 -04:00
Mohamad Tarbin
9f9724ce36 Merge pull request #75 from GilDev/patch-1
Fix typo "notification"
2026-03-30 01:08:16 -04:00
Mohamad Tarbin
264acd0532 Merge pull request #77 from Vi-Ku/fix/hide-signup-when-disabled-602
fix: hide Create new account button when signup is disabled
2026-03-30 01:07:47 -04:00
Mohamad Tarbin
7a495c9bd6 Merge pull request #78 from hoborm/bugfix/rework-create-chore-notification-input
Rework notification input fields, fix verification happening early
2026-03-30 01:05:15 -04:00
Mihály Hóbor
42549bf1a6 Rework notification input fields, fix verification happens too early. Adjust ranges. 2026-03-28 02:41:13 +01:00
vi-ku
56c97001fa fix: hide Create new account button when signup is disabled
When is_user_creation_disabled is true in the /resource API response,
hide the 'Create new account' button on the login page entirely instead
of showing it and blocking with an error after the form is filled.

Fixes: donetick/donetick#602
2026-03-27 20:35:13 +05:30
Mo Tarbin
4ad8b1aef8 Fix https://github.com/donetick/donetick/issues/604 Enhance ChoreEdit component with dropdown for archive/unarchive actions and add delete option 2026-03-24 17:04:25 -04:00
Mo Tarbin
92e8160505 Fix https://github.com/donetick/donetick/issues/611 on-time check in ActivityItem to handle missing dueDate 2026-03-24 16:51:57 -04:00
Mo Tarbin
0b19cdc95c Add 'Missed' and 'Rescheduled' statuses to ChoreHistoryStatus and update related components 2026-03-23 22:31:59 -04:00
Mo Tarbin
c4b6674492 Add '/password/update' to public pages in NavBar component to allow password reset 2026-03-23 22:31:17 -04:00
Mo Tarbin
cd2fa7943b Refactor chore selection logic to pass 'chores' parameter to getSelectedChoresData in bulk actions 2026-03-23 22:30:56 -04:00
Gilles Devillers
6245f25b7c Fix typo "notification" 2026-03-17 10:52:50 +01:00
Mo Tarbin
3c29d4a19f Merge branch 'dev' 2026-03-15 23:48:29 -04:00
Mo Tarbin
f917952083 revert completion window back to hours 2026-03-15 23:48:07 -04:00
Mo Tarbin
6fe22a5fa4 Reset project and filters on search filter clear in MyChores component 2026-03-15 23:37:52 -04:00
Mo Tarbin
8ea12399d3 Change button variant to 'outlined' for active insights in SmartInsightsCard 2026-03-15 23:09:38 -04:00
Mo Tarbin
2947d9aeec Remove Deadline for now as i want to spend more time thinking about it. as of now it's not tied to anything anyway 2026-03-15 23:09:38 -04:00
Mo Tarbin
17551f813b Fix https://github.com/donetick/frontend/issues/72 Add styles to prevent iOS Safari auto-zoom on input focus in index.css and RichTextEditor.css 2026-03-15 23:09:38 -04:00
Mo Tarbin
8022a0cd92 Change button variant to 'outlined' for active insights in SmartInsightsCard 2026-03-15 23:08:09 -04:00
Mo Tarbin
e5edaeb147 Remove Deadline for now as i want to spend more time thinking about it. as of now it's not tied to anything anyway 2026-03-15 23:07:16 -04:00
Emilio Veloci
4b1bd48487 ChoreCard: Fix rendering of chores names starting with a digit 2026-03-12 16:33:46 +01:00
Mo Tarbin
980a539ad2 Fix https://github.com/donetick/frontend/issues/72 Add styles to prevent iOS Safari auto-zoom on input focus in index.css and RichTextEditor.css 2026-03-11 22:26:42 -04:00
Mohamad Tarbin
cef329376b Merge branch 'main' into feature/internationalization-support 2026-03-10 23:10:48 -04:00
Mo Tarbin
230546d57f Remove Translation instruction 2026-03-10 23:04:05 -04:00
Mo Tarbin
b418ef0f99 Merge branch 'dev' of https://github.com/meauxt/donetick-frontend into dev 2026-03-09 01:10:14 -04:00
Mo Tarbin
343245f290 Add Smart Insights feature to Sidepanel and refactor SidepanelSettings 2026-03-09 01:10:00 -04:00
Mohamad Tarbin
5ec2db5dca Update Crowdin configuration file 2026-03-09 01:06:02 -04:00
Mohamad Tarbin
c21f4e1d2e Merge pull request #71 from donetick/dev
Fix multiselect issues and enhance chore management features
2026-03-09 00:02:37 -04:00
Mo Tarbin
a49404b877 Add Smart Insights feature to Sidepanel and refactor SidepanelSettings 2026-03-08 23:59:20 -04:00
Mo Tarbin
1982408881 Add scheduled notifications management to DeveloperSettings 2026-03-08 23:22:10 -04:00
Mo Tarbin
4e352e1430 Add app state change listener to manage focus state with React Query 2026-03-08 23:21:20 -04:00
Mo Tarbin
4fa0f5ffeb Refactor duration handling and enhance chore management features
- Replace hardcoded time units with TIME_UNITS constant in NotificationTemplate.
- Introduce DurationInput component for reusable duration selection in ChoreEdit and AddTaskModal.
- Update chore queries to refetch on window focus.
- Adjust completion window logic in ChoreView and HistoryCard for better deadline handling.
- Implement smart insights filter restoration in MyChores.
- Add MyChoreHeader component for improved filter display.
- Enhance activity notes display with truncation and modal view in ActivitiesCard.
2026-03-08 23:21:02 -04:00
Mo Tarbin
fc91894336 Refactor localization handling across components
- Updated LocalizationContext to consolidate date and time formatting functions into a single `fmt` object.
- Modified ChoreCardHelpers to accept a time format parameter for due date text.
- Adjusted ChoreView, RepeatSection, TimePassedCard, and other components to utilize the new `fmt` object for date and time formatting.
- Enhanced HistoryCard and TimerEditModal to use the new localization functions for consistent date and time display.
- Refined Settings and CircleSettings to leverage the updated localization methods for subscription and member date displays.
- Improved ThingsHistory and UserActivities to format dates and times using the new localization structure.
- Ensured CalendarCard and CalendarDual components utilize the new formatting functions for better readability.
2026-03-08 23:08:37 -04:00
Mo Tarbin
176f66b437 feat: Add French and Dutch localization support for common UI elements 2026-03-08 23:02:36 -04:00
Mo Tarbin
0a0a5bd60f feat: Add Saturday localization support in settings and update calendar type handling 2026-03-08 21:59:42 -04:00
Mo Tarbin
e5504e0bdf Complete ChoreView and Settings translation for ES and Arabic
- Add all missing translation keys to ChoreView component
- Replace hardcoded strings with i18n translation calls
- Complete Spanish (es) translations for ChoreView and Settings
- Complete Arabic (ar) translations for ChoreView and Settings
- Update ProfileSettings component with full translation support
- Add translations for notifications, confirmations, and UI labels
2026-03-09 01:15:33 +00:00
Mo Tarbin
220c068822 fix: Use formatDateTime instead of formatDate for nextDueDate in ChoreView
The formatDate function was being called with a boolean (true) as the format
parameter, which caused moment.js to throw 'format.match is not a function' error.
Changed to use formatDateTime() which properly formats both date and time.
2026-03-09 00:56:24 +00:00
Mo Tarbin
1214c17389 feat: Add RTL drawer support, translate ChoreView, and apply date format preferences
Navigation:
- Fix drawer to slide from right in RTL languages (Arabic, Hebrew)
- Add anchor prop based on isRTL flag
- Drawer now properly positioned for RTL languages

ChoreView Translations:
- Add comprehensive Arabic and Spanish translations for ChoreView
- Translate info cards (Assignment, Schedule, Statistics, Details)
- Translate notification messages (Task Completed, Undo, etc.)
- Translate action buttons and confirmation modals
- Translate timer-related modals (Reset Timer, Clear All Time Records)

Date Format Application:
- Replace hardcoded moment date formats with formatDate()
- Apply user's selected date format preference in ChoreView
- Due date chip now respects user's date format setting
- Dates display consistently according to user preference

All UI text in ChoreView now translates to Arabic and Spanish.
Navigation drawer slides from correct side for RTL languages.
2026-03-08 16:51:18 +00:00
Mo Tarbin
a82f6b16b7 feat: Add translations for navigation and settings overview, improve RTL support
- Add navigation translations (All Tasks, Archived, Things, etc.)
- Translate NavBar menu items and logout button
- Add comprehensive SettingsOverview translations
- Translate upgrade card and all settings sections
- Add ChoreView translations structure
- Improve RTL CSS support for better card alignment
- Fix flex, list, and container alignment for RTL languages

Navigation drawer now shows translated menu items in user's language.
Settings overview page fully translated.
RTL languages (Arabic, Hebrew) now have proper alignment for sidepanel cards.
2026-03-08 16:37:02 +00:00
Mo Tarbin
7f74574a7f fix: Add localization route and settings menu entry
- Add LocalizationSettings to RouterContext routes
- Add localization card to SettingsOverview menu
- Update LocalizationSettings to use SettingsLayout
- Add Language icon import

Now accessible at /settings/localization
2026-03-08 16:22:13 +00:00
Mo Tarbin
6d6185dc5e feat: Add comprehensive internationalization (i18n) support
- Add multi-language support with i18next and react-i18next
- Implement user-selectable date format preferences (5 formats)
- Add time format preferences (12-hour/24-hour)
- Implement RTL (right-to-left) support for Arabic, Hebrew, Persian, Urdu
- Add first day of week preference
- Create LocalizationContext for managing i18n settings
- Add LocalizationSettings component to Settings page
- Include sample translations: English, Spanish, Arabic
- Configure 10 languages: en, es, fr, de, ar, he, zh, ja, pt, ru
- Add translation management documentation and Crowdin config
- Create date formatting utilities that respect user preferences
- Add RTL CSS styles for proper layout mirroring
- Update Settings and ThemeToggle components to use translations
- Add comprehensive documentation (implementation guide, quick reference, translation guide)

All user preferences are persisted to localStorage and apply throughout the app.
2026-03-08 15:57:57 +00:00
Mo Tarbin
21e0b08716 Fix https://github.com/donetick/donetick/issues/576
tailwind.config.js — Added corePlugins: { preflight: false } to disable Tailwind's Preflight reset. Preflight forces svg { display: block } which breaks MUI Joy's inline icon layout inside <Select>, <Autocomplete>, etc., making the icon area unclickable. Since MUI Joy's <CssBaseline /> already provides a CSS reset, Preflight was redundant.

index.css — Removed the global button, a, [role="button"] { transform: translateZ(0); backface-visibility: hidden; } rule. This was creating new stacking contexts on every button element, which interfered with MUI Joy's internal pseudo-element overlays used for click-target expansion.
2026-03-07 23:25:02 -05:00
Mihaly Hobor
651a6d6b3d Fix chore list view doesn't update when chore is deleted. 2026-02-27 23:51:24 +01:00
Mo Tarbin
658054b13d Clear active filter when navigating to All Tasks When a filter was active and the user navigated to /chores
via the navbar, the activeFilterId state persisted even though the
  filterId
2026-02-23 01:40:20 -05:00
Mo Tarbin
58ebfb71d1 Fix unable to use multiselect
https://github.com/donetick/donetick/issues/544
2026-02-22 23:19:47 -05:00
Emilio Veloci
842fb976cd Chores filter: Add filter for "Assigned to me or not assigned"
Use case:
An user might want to work on the chores assigned to them or still not
assigned, whereas they might not be interested in the chores already
assigned to other users.
2026-02-21 18:05:02 +01:00
Emilio Veloci
8c28183410 README: Point to the full documentation in backend 2026-02-21 18:04:33 +01:00
Mohamad Tarbin
5ae1036f4d Merge pull request #51 from hoborm/bugfix/chorecard-assigned-self
Show chore assigned person even if it's our own.
2026-02-21 11:48:13 -05:00
Mohamad Tarbin
cf70854af5 Merge pull request #61 from wjzijderveld/password-length
Aligned password requirements and increased max-length to 64
2026-02-21 11:47:14 -05:00
Mo Tarbin
da1f7bea4f handleTaskCompletion to remove timeout and improve undo functionality 2026-02-18 01:08:59 -05:00
Mo Tarbin
a8180a04ab add NoteViewerModal and integrate note viewing functionality in HistoryCard 2026-02-18 00:19:33 -05:00
Mo Tarbin
55acdfba2a streamline EditHistoryModal layout and improve button placement 2026-02-18 00:19:15 -05:00
Mo Tarbin
4b4498e84d add NoteViewerModal for displaying chore notes and descriptions
Fix https://github.com/donetick/donetick/issues/532
2026-02-18 00:18:44 -05:00
Mo Tarbin
f483653506 show performer avatar in HistoryCard component 2026-02-16 18:27:52 -05:00
Mo Tarbin
6e3def2c13 Fix : skip rending when no entry selected
Add Support for notification when action happen
https://github.com/donetick/donetick/issues/471
2026-02-16 12:15:51 -05:00
Mo Tarbin
6416378b78 update package versions and remove deprecated react-swipeable-list dependency 2026-02-16 11:27:48 -05:00
Mo Tarbin
3591bce1b5 fix: clear selected project from local storage when the active project is deleted 2026-02-16 00:04:20 -05:00
Mo Tarbin
174a00c469 fix: update button label from 'Create Custom Filter' to 'Create Filter' in SortAndGrouping component 2026-02-16 00:02:15 -05:00
Mo Tarbin
f07cb350d4 fix: parse filter ID as number in MyChores component 2026-02-15 23:59:57 -05:00
Mo Tarbin
3d8fbe05f3 Shoe UserActivites even where there is no data 2026-02-15 23:28:54 -05:00
Mo Tarbin
1fc1d69dae feat: add MoreVert icon button for toggle actions in multiple components 2026-02-15 23:21:44 -05:00
Mo Tarbin
af401e7b27 refactor: replace react-swipeable-list with @meauxt/react-swipeable-list across multiple views 2026-02-15 23:17:09 -05:00
Mo Tarbin
bc274b2cf7 fix: update subscription modal navigation in UserProfileAvatar 2026-02-15 11:39:25 -05:00
Mo Tarbin
488c732f3c Unify the chip texts generator logic for chorecard 2026-02-15 11:39:05 -05:00
Willem-Jan
4d58e52729 Aligned password requirements and increased max-length to 64 2026-02-15 13:18:33 +01:00
Mo Tarbin
0b7d7bbe7f fix: update dependency array in AppContent useEffect to when to show there is update
https://github.com/donetick/donetick/issues/521
2026-02-14 16:58:03 -05:00
Mo Tarbin
75ac9fd38d bump version to 1.2.0 for Android, iOS, and package.json 2026-02-14 16:50:09 -05:00
Mo Tarbin
d8d7b6a766 Merge branch 'main' into dev 2026-02-10 23:21:33 -05:00
Mo Tarbin
aaa7bae55f force flow torecat for all screen 2026-02-10 23:21:27 -05:00
Mo Tarbin
1786a5e910 Merge branch 'dev' 2026-02-10 20:38:16 -05:00
Mo Tarbin
d9d93ffad3 clean up imports and remove unused quick schedule functionality in DateModal 2026-02-10 20:38:01 -05:00
Mo Tarbin
032b9f1f17 update version codes to 0.4.0 for Android, iOS, and package.json 2026-02-10 19:06:01 -05:00
Mo Tarbin
eba629e5a7 sync version across ios /android and web 2026-02-10 19:05:09 -05:00
Mo Tarbin
41fb8b6bf4 add bump-version script and update password reset functionality 2026-02-10 12:00:27 -05:00
Mo Tarbin
430e6025fa Merge branch 'dev' 2026-02-10 11:46:16 -05:00
Mo Tarbin
57a16c4904 add bump-version script and update password reset functionality 2026-02-10 11:46:06 -05:00
Mo Tarbin
4525aee9a1 Merge branch 'dev' 2026-02-10 11:11:02 -05:00
Mo Tarbin
e99aae3ed4 fix: hide NavBar on specific domain names 2026-02-10 11:10:50 -05:00
Mo Tarbin
a9cff1f49a Merge branch 'dev' 2026-02-10 01:15:45 -05:00
Mo Tarbin
f5b0f06bba show Ops, something went wrong
if we unable to load chore
2026-02-10 00:57:32 -05:00
Mo Tarbin
f65e72fdc1 Merge branch 'dev' 2026-02-10 00:44:12 -05:00
Mo Tarbin
979565691f adjust due date formatting to include the last second of the day 2026-02-10 00:43:59 -05:00
Mo Tarbin
9c115efecb fix: ensure apiClient initialization and update resource queries in authentication flow 2026-02-10 00:42:25 -05:00
Mo Tarbin
1ce7749826 better display Task has only due date without time 2026-02-10 00:41:08 -05:00
Mo Tarbin
ef232aba88 Merge branch 'dev' 2026-02-09 23:31:25 -05:00
Mo Tarbin
0c9619a550 fix: streamline public pages handling in NavBar component ( revert to previous state) 2026-02-09 23:31:18 -05:00
Mo Tarbin
8b9d20d908 Merge branch 'dev' 2026-02-09 23:25:34 -05:00
Mo Tarbin
1006254090 fix: update landing page routing based on domain conditions 2026-02-09 23:23:26 -05:00
Mo Tarbin
b784f94a64 implement deep link handling for OAuth authentication
https://github.com/donetick/donetick/issues/504
2026-02-09 23:23:12 -05:00
Mo Tarbin
34c382daea feat: add undo functionality for skipped tasks in chore actions 2026-02-09 23:20:10 -05:00
Mo Tarbin
1b57be1d64 Show ability to undo task on choreView
https://github.com/donetick/donetick/issues/505
2026-02-09 23:18:45 -05:00
Mo Tarbin
25676cff8c Limit Local notification to 64 https://github.com/donetick/donetick/issues/506 2026-02-09 23:14:59 -05:00
Mo Tarbin
476c9f5840 Fix Google Authentication sending [object object] instead of serialized obj 2026-02-09 11:16:22 -05:00
Mo Tarbin
d663f047bd Fix OAuth URL 2026-02-09 11:15:36 -05:00
Mo Tarbin
7663a53e1c Merge branch 'dev' 2026-02-08 21:56:17 -05:00
Mo Tarbin
117d8b99df fix: update request body handling in POST and PUT methods to accept raw data 2026-02-08 21:19:55 -05:00
Mo Tarbin
bec69b4706 Merge branch 'dev' 2026-02-08 16:33:49 -05:00
Mo Tarbin
0beb876cb4 refactor: update color and background properties in multiple views for consistency 2026-02-08 16:33:32 -05:00
Mo Tarbin
666eb75779 Merge branch 'dev' 2026-02-08 16:15:22 -05:00
Mo Tarbin
b31bcc2a9c remove the need to resource and profile data on landing page 2026-02-08 16:08:56 -05:00
Mo Tarbin
2c1458e026 chore: update VITE_IS_LANDING_DEFAULT variable to true in .env 2026-02-08 13:58:32 -05:00
Mo Tarbin
8d65b5117e chore: add VITE_IS_LANDING_DEFAULT variable to .env.development 2026-02-08 13:23:45 -05:00
Mo Tarbin
1e0c8a594f chore: update package-lock.json to version 0.1.145 and add new dependencies 2026-02-08 11:40:15 -05:00
Mo Tarbin
b05da7d27c refactor: update NavBar component to include additional public pages and separate AppNavBar and LandingNavBar logic 2026-02-08 11:38:14 -05:00
Mo Tarbin
00e6cf537a Merge branch 'dev' 2026-02-08 10:29:57 -05:00
Mo Tarbin
c2c1c6dfcc update authentication logic to conditionally include credentials for native platforms 2026-02-08 10:29:39 -05:00
Mo Tarbin
753d4cd981 Merge branch 'dev' 2026-02-08 01:40:47 -05:00
Mo Tarbin
86cfc10741 chore: update dependencies in package.json and refactor import statements in modal components 2026-02-08 01:40:33 -05:00
Mo Tarbin
492e2f2e7e refactor: update modal components to use larger size and full width with titles 2026-02-08 01:39:33 -05:00
Mo Tarbin
560cceca9b refactor: simplify menu icon logic in NavBar component 2026-02-08 01:35:45 -05:00
Mo Tarbin
f19f8ca2a7 Merge branch 'dev' 2026-02-07 23:31:04 -05:00
Mo Tarbin
925cf982ca chore: update version to 0.1.145 in package.json 2026-02-07 23:30:54 -05:00
Mo Tarbin
30a7e3b429 Merge branch 'main' of https://github.com/Donetick/frontend 2026-02-07 23:28:08 -05:00
Mo Tarbin
f978c6f7d7 enhance Fetch function to handle different HTTP methods in apiClient 2026-02-07 23:26:55 -05:00
Mo Tarbin
facbf8ec02 replace loading state with LoadingComponent in CircleSettings 2026-02-07 23:26:40 -05:00
Mo Tarbin
ac338e9299 fix: update link to redirect users to the Google Play Store 2026-02-07 23:26:25 -05:00
Mo Tarbin
d18e6412f0 feat: add quick scheduling options in DateModal with chips for today, tomorrow, weekend, and next week 2026-02-07 23:26:17 -05:00
Mo Tarbin
373096b339 Rewrite the Swiping Logic and update the Project, Labelm Things,Chore and all swipe card/view 2026-02-07 23:26:06 -05:00
Mohamad Tarbin
bb4bff50b3 Merge pull request #49 from hoborm/feature/swagger
Exclude swagger for service worker fallback
2026-02-06 18:12:55 -05:00
Mo Tarbin
c9baf04505 Refactor: update condition handling for status selection in AdvancedFilterBuilder
Fix https://github.com/donetick/frontend/issues/59
2026-02-05 10:36:49 -05:00
Mo Tarbin
938fec1ab3 Fix: prevent the layout jump when you start typing https://github.com/donetick/frontend/issues/58 2026-02-05 10:28:17 -05:00
Mo Tarbin
ed9f04332e remove color chip from Project and Label
https://github.com/donetick/frontend/issues/57
2026-02-05 09:23:14 -05:00
Mo Tarbin
c20e8d1aea Refactor: optimize filter sorting with useMemo and integrate useFilters in AdvancedFilterBuilder 2026-02-04 00:22:07 -05:00
Mo Tarbin
3a13f111eb reorganize filter query hooks and remove unused track usage mutation 2026-02-04 00:09:14 -05:00
Mo Tarbin
6c95c683ba migrate filter management to API and implement query hooks for filters 2026-02-04 00:06:44 -05:00
Mo Tarbin
d666f59c1b https://github.com/donetick/donetick/issues/493 2026-02-03 17:57:48 -05:00
Mo Tarbin
28869498ae add points condition evaluation and update filter builder for points selection 2026-02-03 00:46:10 -05:00
Mo Tarbin
81104a3f38 Refactor: simplify filter chip rendering and adjust styles for better usability 2026-02-03 00:45:52 -05:00
Mo Tarbin
48cdbf6b6b remove the icon and show only the color for now 2026-02-02 19:39:08 -05:00
Mo Tarbin
7e9ce00166 have the project id default to whatever select when open new task 2026-02-02 19:33:35 -05:00
Mo Tarbin
c3431b0921 Refactor: update placeholder text for filter name and replace label colors with project colors in ProjectModal 2026-02-02 19:32:25 -05:00
Mo Tarbin
27210317fd Fix: navigate to chores instead of filters via and provide searchparam 2026-01-31 13:06:05 -05:00
Mo Tarbin
312b51a5fd Hide the scroll back on the chip for quick filter 2026-01-31 12:54:45 -05:00
Mo Tarbin
96a649ca9c Scroll to the new condition when adding new field 2026-01-31 12:52:54 -05:00
Mo Tarbin
445d8168e1 if filter selected then remove the advance filter and vera versa 2026-01-31 12:49:26 -05:00
Mo Tarbin
24a219853e update default project description for clarity and remove the default color 2026-01-31 01:23:46 -05:00
Mihaly Hobor
4271159294 Merge branch 'main' into feature/swagger 2026-01-28 18:28:22 +01:00
Mo Tarbin
9ff94a4402 fix: remove unnecessary blank lines and correct syntax error in importFilters function 2026-01-28 00:00:25 -05:00
Mo Tarbin
448b8fa160 feat: enhance filter functionality and UI improvements
- Added FilterView component for managing custom filters.
- Implemented temporary filter application in MyChores and custom filter hooks.
- Improved sorting of archived chores by updated date.
- Enhanced SortAndGrouping component with keyboard navigation support.
- Updated CustomFilterChips to visually indicate active filters.
- Refactored AdvancedFilterBuilder to improve usability and added listbox positioning.
- Integrated project selection caching in ProjectView for better navigation.
- Cleaned up unused imports and optimized existing code for better performance.
2026-01-27 23:50:49 -05:00
Mo Tarbin
aa46eb4c6d fix: Update notification timing label and refactor notification rendering for improved clarity 2026-01-26 23:08:36 -05:00
Mo Tarbin
7e35fa8710 feat: Enhance FadeModal with title and footer support; update AdvancedFilterBuilder to use fullWidth 2026-01-26 23:08:28 -05:00
Mo Tarbin
66b9e9b5c1 fix: Ensure 'Content-Type' header is set for POST, PUT, and DELETE requests 2026-01-26 23:08:13 -05:00
Mo Tarbin
ad45bafd62 feat: Refactor Filter Section and Add Filter View
- Removed unused props and components from FilterSection.
- Introduced FilterView component to manage and display saved filters.
- Implemented swipe functionality for filter actions (edit, delete, pin).
- Enhanced AdvancedFilterBuilder with description and color selection.
- Deleted obsolete SaveFilterModal component.
- Updated NavBar to include a link to the new Filters page.
- Adjusted chore filter hooks for improved functionality and organization.
2026-01-26 17:27:27 -05:00
Mihály Hóbor
4cb2b34d11 Change comment 2026-01-26 16:32:53 +01:00
Mo Tarbin
2b8482cb06 feat: add custom filter chips and filter section components
- Implemented CustomFilterChips component for displaying and managing custom filters with context menu options for pinning, editing, and deleting filters.
- Created FilterSection component to integrate CustomFilterChips and provide UI for creating advanced filters and displaying active filters.
- Introduced useCustomFilters hook to manage custom filter logic, including loading, saving, updating, and deleting filters.
- Added AdvancedFilterBuilder modal for creating and editing advanced filters with dynamic condition handling.
- Implemented SaveFilterModal for saving filters with preview functionality and validation for filter names.
- Enhanced useChoreFilters and useProjectFilter hooks for improved filter management and state handling.
2026-01-26 01:58:21 -05:00
Mo Tarbin
57bc6ad98e Refactor MyChores component for improved maintainability
Reduced MyChores.jsx from 2,839 to 1,364 lines (52% reduction) by extracting reusable hooks and components.

   Created 6 custom hooks:
   - useMultiSelect: Multi-select mode and selection state management
   - useChoreModals: Centralized modal state management
   - useProjectFilter: Project filtering with localStorage sync
   - useChoreFilters: Multi-layer filtering (project, search, user filters)
   - useKeyboardShortcuts: All keyboard event handling
   - useChoreActions: Chore actions and bulk operations

   Created 3  components:
   - SearchBar: Clean search input with keyboard hints
   - MultiSelectToolbar: Full multi-select toolbar with action buttons
   - ChoreModals: Centralized modal rendering
2026-01-25 21:26:15 -05:00
Mohamad Tarbin
8ec8816e45 Merge pull request #27 from Tirzono/fix-notification-typo
fix: change Notificaiton to Notification
2026-01-25 19:59:27 -05:00
Mohamad Tarbin
801bc2ab66 Merge branch 'main' into fix-notification-typo 2026-01-25 19:58:31 -05:00
Mohamad Tarbin
5fec87e688 Merge pull request #43 from natea/main
fix: remove optional=false from .npmrc to fix esbuild installation
2026-01-25 19:52:53 -05:00
Mohamad Tarbin
9490c00f9f Merge pull request #36 from SlIdE42/patch-1
Fix missing HTML title
2026-01-25 19:35:05 -05:00
Mihály Hóbor
a14dde8183 Show chore assigned person even if it's our own. 2026-01-25 23:32:04 +01:00
Mohamad Tarbin
b742cda635 Merge pull request #47 from hoborm/feature/windows-developer-build
Add windows developer build
2026-01-22 22:50:54 -05:00
Mihaly Hobor
2e92acbfd5 Exclude swagger for service worker fallback 2026-01-22 23:17:02 +01:00
Mihaly Hobor
7af904d860 Add windows developer build 2026-01-22 23:15:16 +01:00
Mo Tarbin
59289a2f40 Merge branch 'dev' 2026-01-21 00:26:18 -05:00
Mo Tarbin
b08d0a76ee fix: Update import path for apiClient to use consistent casing 2026-01-21 00:26:12 -05:00
Mo Tarbin
cc8fdbe4a6 Merge branch 'dev' 2026-01-21 00:19:18 -05:00
Mo Tarbin
64eb477f4f fix: Correct import path formatting for apiClient 2026-01-21 00:19:08 -05:00
Mo Tarbin
68f368dc94 Merge branch 'dev' 2026-01-21 00:16:40 -05:00
Mo Tarbin
219d9b2a59 fix: Update import paths for apiClient to use consistent casing 2026-01-21 00:16:26 -05:00
Mo Tarbin
a7e1506ea0 Merge branch 'dev' 2026-01-21 00:12:55 -05:00
Mo Tarbin
f61cfaa781 fix: Update import path for apiClient to use consistent casing 2026-01-21 00:12:42 -05:00
Mo Tarbin
66de395549 Merge branch 'dev' 2026-01-21 00:09:44 -05:00
Mo Tarbin
242f382da3 chore: Remove empty optionalDependencies section from package.json 2026-01-21 00:09:38 -05:00
Mo Tarbin
a879bd09b4 feat: Add android build script and baseline-browser-mapping dependency 2026-01-21 00:09:15 -05:00
Mo Tarbin
ed273fbfce chore: Bump version to 0.1.120 in package.json 2026-01-21 00:08:08 -05:00
Mo Tarbin
31cb8f9fab Update import paths for apiClient to use consistent casing 2026-01-21 00:07:13 -05:00
Mo Tarbin
2aeb6598dc Merge branch 'dev' 2026-01-20 19:40:11 -05:00
Mo Tarbin
9810083304 fix: Correct import path for apiClient in useAuth hook 2026-01-20 19:40:00 -05:00
Mohamad Tarbin
23fd0482c8 Merge pull request #38 from pano9000/main
fix: UI strings - use consistent spacing/capitalization
2026-01-18 12:57:38 -05:00
Mohamad Tarbin
39f9e16a61 Merge pull request #39 from louim/bugfix/week-of-month
Replace nth_day_of_month with week_of_month
2026-01-18 12:56:58 -05:00
Mo Tarbin
c3a5e759b7 Merge branch 'dev' 2026-01-18 12:54:58 -05:00
Mo Tarbin
f9d5aeee91 feat: Add reconnection schedule and timeout configuration to Developer Settings 2026-01-18 12:54:49 -05:00
Mo Tarbin
371631856a feat: Add Developer Settings page and integrate with SSE context for debugging
refactor: Update ApiClient to support dynamic server URL and improve token handling
refactor: Modify TokenStorage to utilize Capacitor for native platforms
refactor: Adjust Fetcher to use updated ApiClient methods
refactor: Enhance SettingsOverview to include Developer Settings option
2026-01-18 12:54:13 -05:00
Mohamad Tarbin
73f33bc0a3 Merge pull request #44 from ricmatsui/feature/avoid-tab-search-conflict
Ignore Cmd/Ctrl+Shift+A to avoid conflict with Chrome tab search shortcut
2026-01-17 19:37:59 -05:00
Mohamad Tarbin
ed595a3815 Merge pull request #37 from lauraneto/bugfix/android-allow-http-requests
Allow HTTP (non secure) requests in Android app
2026-01-17 19:37:01 -05:00
Mo Tarbin
7c8fa27aaf feat: Add unarchive functionality to ChoreView and enhance project management features
- Implemented unarchive button for archived chores in ChoreView.
- Updated chore status handling to disable actions for archived chores.
- Enhanced MyChores component to filter tasks based on project selection, including a default project.
- Improved ProjectModal to streamline project creation and editing with a new footer layout.
- Refactored ProjectView to accurately count tasks for default and user projects.
- Added project selection dropdown in AddTaskModal with default project handling.
- Updated NavBar to handle logout using apiClient.
- Enhanced ProjectSelector to manage projects with a new menu item for project management.
2026-01-17 19:35:36 -05:00
Mo Tarbin
b326b1b3d7 refactor: update localStorage keys for token and expiration in authentication components 2026-01-16 15:04:27 -05:00
Mo Tarbin
f527064e55 implement View Transitions API for smoother page navigation and replace the current implementation 2026-01-16 12:12:36 -05:00
Mo Tarbin
3a074ef6c5 Add Support Project 2026-01-16 12:12:00 -05:00
Mo Tarbin
7fbae16a53 Add Support Project 2026-01-16 12:11:03 -05:00
Mo Tarbin
98018ca590 fix: update SSE message handler to reflect latest userProfile changes
there was issue where userprofile was undefined cause the message being display for same user how make the action.  The new useEffect hook updates the EventSource's handler whenever handleSSEMessage changes
2026-01-10 14:14:45 -05:00
Mo Tarbin
7d5724d8d5 add project filtering to MyChores component 2026-01-01 02:14:19 -05:00
Mo Tarbin
ba17a5592c feat: add ProjectModal component for creating and editing projects 2026-01-01 01:32:23 -05:00
Mo Tarbin
7332e81e6e Fix https://github.com/donetick/donetick/issues/373 compact card not showing the right performer 2025-12-27 16:45:49 -05:00
Mo Tarbin
5aeacef511 fix: enhance SSE error handling and token refresh logic; improve user profile checks in MyChores component 2025-12-26 19:59:39 -05:00
Ricardo Matsui
8f3fd3b37e Ignore cmd/ctrl+shift+a to avoid conflict with Chrome tab search shortcut 2025-12-26 12:42:12 -08:00
Mo Tarbin
0fd58860a8 Improve the flow for archive screen. Fix https://github.com/donetick/frontend/issues/41 2025-12-25 22:55:09 -05:00
Mo Tarbin
8edd3774d2 Support Refresh token and improve authentication and security.
Refactor authentication handling and API client integration

- Updated UserProfileAvatar to use 'access_token' instead of 'ca_token' for logout.
- Removed SSEProvider from Contexts and adjusted related imports.
- Introduced useAuth hook for centralized authentication logic, including login, logout, and token management.
- Refactored useSSE to utilize the new useAuth hook for token validation.
- Updated UserQueries to check for token validity using the new method.
- Deleted AuthenticationService as its functionality is now handled by useAuth.
- Created a new ApiClient utility for handling API requests and token management.
- Updated various components and views to use the new ApiClient for API interactions.
- Removed TokenManager and migrated its functionality to the new ApiClient.
- Adjusted LoginView and related components to utilize the new authentication flow.
- Cleaned up unused variables and improved code consistency across components.
2025-12-25 22:54:39 -05:00
Nate Aune
dd1a4cba76 fix: remove optional=false from .npmrc to fix esbuild installation
Problem:
npm install was failing with the error:
  Error: Expected "0.21.5" but got "0.18.20"

This occurred because esbuild's install.js validates that the installed
binary version matches the package.json version, but was finding an
older cached binary.

Root cause:
The .npmrc setting `optional=false` was preventing esbuild from
downloading its platform-specific binary package (@esbuild/darwin-arm64,
etc.). These platform binaries are marked as optionalDependencies in
esbuild's package.json.

Without the correct platform binary, esbuild's postinstall script would
find a stale/cached binary from a previous installation and fail the
version check.

Troubleshooting steps taken:
1. Attempted rm -rf node_modules && npm install - same error
2. Cleared npm cache with npm cache clean --force - same error
3. Checked for global esbuild installations - none found
4. Reviewed npm config and found optional=false in .npmrc
5. Ran npm install --include=optional - succeeded
6. Removed optional=false from .npmrc to permanently fix

The fund=false and audit=false settings are retained as they don't
affect dependency installation, only npm's output behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-06 11:24:19 -05:00
Mo Tarbin
1123fb3ca6 fix: update onAction handler to accept extra data in ChoreCard component 2025-12-02 18:42:16 -05:00
Mo Tarbin
5bfd340176 Support unicode letter in the parser. Fix https://github.com/donetick/donetick/issues/395 2025-12-02 15:58:06 -05:00
Mo Tarbin
7cb2f203b1 refine platform check for native functionality in AccountSettings and Settings components 2025-12-02 00:23:13 -05:00
Louis-Michel Couture
412d0a19e7 Replace nth_day_of_month with week_of_month
The backend expects this string since 0fa913fb83
2025-10-31 00:18:04 -04:00
Panagiotis Papadopoulos
f2a50141b7 fix: UI strings - use consistent spacing/capitalization 2025-10-29 08:37:23 +01:00
Laura Neto
7f65ce0e84 Allow HTTP (non secure) requests in Android app 2025-10-19 19:22:30 +02:00
SlIdE42
8f577a4368 Fix #33 2025-10-07 19:31:07 +02:00
Mo Tarbin
09f89afe2a fix: update state initialization and improve Grid component usage in ChoreView 2025-10-05 14:24:26 -04:00
Mo Tarbin
d1dcdc2f50 feat: add 'Gentle Nudges' feature with customizable reminders in FeaturesSection 2025-10-05 14:16:25 -04:00
Mo Tarbin
e31a5f705c replace CalendarView with CalendarMonthly and improve chore date formatting 2025-10-04 13:18:25 -04:00
Mo Tarbin
04314d507b Fix: https://github.com/donetick/donetick/issues/127
https://github.com/donetick/donetick/issues/277
2025-10-03 00:42:33 -04:00
Mo Tarbin
409c5a0ba3 enhance user input validation and parsing for usernames, points, and labels 2025-10-02 21:45:25 -04:00
Mo Tarbin
68f09125d4 chore: bump version to 0.1.115 2025-09-28 19:32:40 -04:00
Mo Tarbin
ac2d4911fe feat: update user activity filters to allow selection of last 7 days and improve UI layout 2025-09-28 19:13:38 -04:00
Mo Tarbin
26c2eaddff implement child user management functions and user type utilities 2025-09-28 19:13:28 -04:00
Mo Tarbin
d41d6bd758 feat: add sub user management features including creation, deletion, and password updates 2025-09-28 19:12:26 -04:00
Mo Tarbin
86b8bbfb5f show API version on navbar 2025-09-28 18:46:56 -04:00
Mo Tarbin
7658b4c9fe feat: add 'Anyone' option for assignees and disable Limited option when no assignees are selected 2025-09-28 02:46:15 -04:00
Mo Tarbin
f1384eef34 enhance chore management with status updates and default assignee settings 2025-09-28 02:24:08 -04:00
Mo Tarbin
c7c4a011ef Refactor chore management components to centralize action handling
- Removed individual chore action handlers from ChoreCard and CompactChoreCard.
- Introduced a unified `onAction` prop to handle various chore actions (approve, reject, complete, start, pause, delete, etc.) in a centralized manner.
- Updated ChoreActionMenu to utilize the new `onAction` prop for performing actions on chores.
- Simplified state management and notification handling for chore updates.
- Cleaned up unused imports and state variables across affected components.
2025-09-28 02:20:18 -04:00
Mo Tarbin
bdd73135f0 feat: integrate impersonated user handling for task completion 2025-09-27 20:29:28 -04:00
Mo Tarbin
b367410aaf fix: adjust transition timeout and add UNASSIGNED color constant 2025-09-27 13:48:20 -04:00
Mo Tarbin
c27404cc3a Refactor chore management modals and actions for centralized handling
- Removed individual modal states and handlers from ChoreCard and CompactChoreCard components.
- Introduced a centralized modal state and handler in MyChores component to manage modals for changing due dates, completing with past dates, changing assignees, adding notes, writing NFC, and nudging.
- Updated action handlers to utilize the new centralized approach for better maintainability and readability.
- Cleaned up unused imports and code related to modal management in ChoreCard and CompactChoreCard components.
2025-09-27 13:47:41 -04:00
Mo Tarbin
9ff2359b4c Remove Websocket code since we are only using SSE 2025-09-27 13:38:45 -04:00
Mohamad Tarbin
d28ecb509e Performance optimization 09 24 (#6)
* perf: optimize MyChores component performance and fix timer errors

## Fixed Issues
-  Timer error: `Timer '🏁 Main useEffect processing' does not exist`
-  Reduced 1049ms and 613ms message handler violations
-  Fixed 1+ second blank screen before chores display
-  Eliminated multiple redundant `getFilteredChores` calculations

## Performance Optimizations

### 1. Fixed Timer Execution Issue
**Problem**: React strict mode was causing timer mismatch between `console.time` and `console.timeEnd`
**Solution**: Restructured async useEffect to ensure proper timer lifecycle
```javascript
// Before: Timer in async IIFE caused double-execution issues
;(async () => {
  console.time('🏁 Main useEffect processing')
  // ...
  console.timeEnd('🏁 Main useEffect processing')
})()

// After: Proper async function structure
const processEffectAsync = async () => {
  // ... async operations
  console.timeEnd('🏁 Main useEffect processing')
}
processEffectAsync()
```

### 2. Optimized useState Lazy Initialization
**Problem**: `JSON.parse()` called on every render for state initialization
```javascript
// Before: Expensive operation on each render
const [openChoreSections, setOpenChoreSections] = useState(
  JSON.parse(localStorage.getItem('openChoreSections')) || {},
)

// After: Lazy initialization with error handling
const [openChoreSections, setOpenChoreSections] = useState(() => {
  try {
    return JSON.parse(localStorage.getItem('openChoreSections')) || {}
  } catch {
    return {}
  }
})
```

### 3. Reduced useEffect Dependencies
**Problem**: useEffect running too frequently due to object reference dependencies
```javascript
// Before: Full objects cause frequent re-runs
}, [choresData, membersData, userProfile, impersonatedUser, ...]

// After: Only specific properties that matter
}, [choresData?.res, membersData?.res, userProfile?.id, impersonatedUser?.userId, ...]
```

### 4. Added Memoization for Section Updates
**Problem**: `choreSections` updated even when data hadn't actually changed
```javascript
// Before: Always updating sections
setChoreSections(processedSections)

// After: Only update if data actually changed
setChoreSections(prevSections => {
  if (JSON.stringify(prevSections) === JSON.stringify(processedSections)) {
    return prevSections
  }
  return processedSections
})
```

### 5. Optimized localStorage Access
**Problem**: Multiple `localStorage.getItem()` calls and repeated parsing
```javascript
// Before: Multiple localStorage calls
if (localStorage.getItem('openChoreSections') === null) {
  // ...localStorage operations
}

// After: Single cached read
const storedSections = localStorage.getItem('openChoreSections')
if (storedSections === null) {
  // ...operations
}
```

### 6. Added useMemo/useCallback for Heavy Computations
- `processedChores` - Memoized chore sorting and filtering
- `processedSections` - Memoized section grouping
- `getFilteredChores` - Memoized filtered chore calculations
- `handleChoreUpdated`, `handleChoreDeleted`, `updateChores` - useCallback for stable references

## Performance Results
**Before**: 1+ second loading delay, timer errors, frequent violations
**After**:
- `processedChores calculation: ~0.002ms` (was much slower)
- `processedSections calculation: ~0.001ms` (was much slower)
- `getFilteredChores: ~0.022ms` (down from multiple slow calls)
- `Main useEffect processing: ~0.298ms` (reasonable time)
- `Auto-update sections: ~0.007ms` (very fast)

🚀 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: update package.json to remove deprecated @vitejs/plugin-react dependency and add wrangler.toml for build configuration

* Revert vite.config.js to it's original state

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-09-26 02:21:07 -04:00
Mo Tarbin
048e7d0ef6 Merge branch 'dev' of https://github.com/Donetick/frontend into dev 2025-09-24 02:19:33 -04:00
Mo Tarbin
1b49a6f3f7 feat: add @vitejs/plugin-react dependency for improved React support 2025-09-21 16:52:53 -04:00
Mo Tarbin
fd6e4880d2 refactor: remove unused safe area utility and simplify layout structure 2025-09-21 13:04:30 -04:00
Mo Tarbin
f27bbd318f Refactor chore management to use React Query hooks for timer and chore actions
- Replaced direct API calls with React Query hooks in ChoreView, ChoreCard, CompactChoreCard, and TimerDetails components for better state management and error handling.
- Updated ArchivedTasks to utilize useUnArchiveChore hook for restoring archived chores.
- Enhanced NotificationSetting to include device registration logic and improved user feedback for push notifications.
- Refactored TimerEditModal and TimerDetails to streamline timer session updates and deletions using hooks.
- Improved ChoreActionMenu to handle archiving and unarchiving chores with hooks.
- Adjusted various components to use getSafeBottomStyles for consistent bottom padding.
- Cleaned up unused imports and optimized loading states across components.
2025-09-21 12:46:03 -04:00
Mo Tarbin
79dfb11fa4 feat: add device token management and safe area utilities; enhance notification settings and chore components 2025-09-20 22:20:02 -04:00
Mo Tarbin
3bf9126595 refactor: replace NotificationSettings component with NotificationSetting in RouterContext 2025-09-20 19:07:26 -04:00
Mo Tarbin
a5a90dfbdd refactor NotificationSetting component to use SettingsLayout; remove NotificationSettings wrapper 2025-09-20 18:45:40 -04:00
Mo Tarbin
ac767f63ae Fix: pass the right user id when impersonating a user to chorefilter
implement experimental offline mode; add toggle in StorageSettings and update chore filters
2025-09-20 18:15:52 -04:00
Mo Tarbin
782862294d feat: integrate Firebase Messaging for push notifications; update AppDelegate and add Info.plist for widget support 2025-09-20 17:32:50 -04:00
Mo Tarbin
eded4b2e16 feat: add nudge functionality to chore cards and action menu; enhance user notifications
fix Filtering when imposing user to respect the sort and grouping order
2025-09-18 01:14:51 -04:00
Mo Tarbin
707ba55e1d feat: implement push notification registration and nudge feature; enhance user settings and notification handling 2025-09-18 01:13:37 -04:00
Mo Tarbin
b71a533024 enhance impersonation context and user profile handling; improve UI interactions in chore history and timer details 2025-09-15 23:52:28 -04:00
Mo Tarbin
36093b9199 refactor: update hero text in HomeHero component for clarity and engagement 2025-09-14 22:05:51 -04:00
Mo Tarbin
bd14a35e23 add terms and privacy policy agreement message to SignupView 2025-09-14 21:56:53 -04:00
Mo Tarbin
406da9732c Fix broken access to term and privacy pages 2025-09-14 21:55:14 -04:00
Mo Tarbin
219aa06835 chore: bump version to 0.1.111 2025-09-11 01:18:39 -04:00
Mo Tarbin
43decb21f4 Refactor StorageSettings to use SettingsLayout and improve layout structure; add ThemeSettings component; update TermsView with new terms and structure; enhance ThingsView styling; clean up AddTaskModal by removing experimental feature chip; create CalendarCard component for calendar overview; optimize CustomParsers for repeat parsing; update NavBar for improved navigation and search parameter handling. 2025-09-11 01:17:27 -04:00
Mo Tarbin
b152da9d21 feat: add ipad screenshot asset and update TabletInstallationSection to use it 2025-09-04 09:16:32 -04:00
Mo Tarbin
14ce2305ce refactor: remove open source badge from footer 2025-09-04 03:01:42 -04:00
Mo Tarbin
a65cb92f37 feat: update TabletInstallationSection to use imported image asset 2025-09-04 02:59:50 -04:00
Mo Tarbin
4a54115e31 remove option dependency 2025-09-04 02:49:30 -04:00
Mo Tarbin
3a80838b4c chore: remove architecture-specific dependencies for darwin arm64 2025-09-04 02:43:24 -04:00
Mo Tarbin
bb16da0f4a feat: add TabletInstallationSection component with responsive design and features 2025-09-04 02:41:54 -04:00
Mo Tarbin
714ae7b9f0 chore: add rollup and swc core dependencies for darwin arm64 architecture 2025-09-04 02:40:27 -04:00
Mo Tarbin
f5f60cc9eb Update dependencies and move architecture-specific packages to optionalDependencies 2025-09-04 02:27:50 -04:00
Mo Tarbin
057c5f7ec8 feat: Add notification types and enhance color management
- Introduced NOTIFICATION_TYPE constants for pre-due, due date, and post-due notifications in Colors.jsx.
- Updated HistoryCard.jsx to utilize TASK_COLOR for chip colors based on task status.
- Created DemoCalendar.jsx to showcase a visual task calendar with sample chore data.
- Enhanced DemoMyChore.jsx to include status for demo tasks.
- Added DemoNotificationTemplate.jsx for demonstrating smart notification scheduling.
- Revamped FeaturesSection.jsx to reflect updated feature descriptions and icons.
- Updated Footer.jsx to link to the correct API reference documentation.
- Improved GettingStarted.jsx with new mobile app download options and enhanced layout.
- Integrated TabletInstallationSection into Landing.jsx for better user guidance.
2025-09-04 01:49:19 -04:00
Mo Tarbin
d704588624 Update Feature Section 2025-09-03 22:56:12 -04:00
Mo Tarbin
c82a6cc0e1 feat: Add Discord and Reddit icon components 2025-09-02 22:41:21 -04:00
Mo Tarbin
603d83ba1b Revamp Footer component with enhanced layout, social links, and updated styling 2025-09-02 22:40:28 -04:00
Mo Tarbin
fd15235124 Enhance UI with section headers and descriptions for Archived Tasks, Labels, Settings, Things, User Activities, and update NavBar 2025-09-02 17:39:05 -04:00
Mo Tarbin
0c1e5a9628 chore: Bump version to 0.1.110 2025-09-02 01:50:49 -04:00
Mo Tarbin
6403d135ea feat: Implement User Switcher and add subscription cancellation modal 2025-09-02 01:50:06 -04:00
Mo Tarbin
a7b33c48b3 fix: Update navigation path after saving chore to remove trailing slash 2025-09-01 23:58:14 -04:00
Mo Tarbin
4e31190291 Add Capacitor Browser dependency and update safe area handling in components 2025-08-30 01:35:38 -04:00
Mo Tarbin
e99a06654e chore: Bump version to 0.1.109 and update dependencies 2025-08-29 00:54:27 -04:00
Mo Tarbin
cf4d0565c5 feat: Enhance Signup and Chores functionality
- Added query invalidation on signup to refresh user profile data.
- Improved MyChores component to ensure data is loaded before rendering.
- Introduced dynamic sidepanel configuration with drag-and-drop functionality.
- Created TasksByAssigneeCard to visualize tasks assigned to users.
- Updated MFASettings and Settings components for better structure and usability.
- Implemented SettingsOverview for a comprehensive settings navigation experience.
- Added SidepanelSettings for customizing sidepanel card visibility and order.
- Refactored NavBar to include user profile avatar and improved layout.
2025-08-29 00:50:54 -04:00
Mo Tarbin
6b5a874db5 Refactor ChoreCard to remove unused circle members data and update approval logic to use performers 2025-08-26 22:11:10 -04:00
Mo Tarbin
defc7a8fa4 Remove unused icon import and comment out 'Upgrade to Plus' ListItemButton in NavBar 2025-08-25 23:58:49 -04:00
Mo Tarbin
06d568e61d Bump version to 0.1.108 in package.json 2025-08-25 23:41:56 -04:00
Mo Tarbin
6064c88f2c Refactor navigation paths to use '/chores' instead of '/my/chores' across multiple components for consistency 2025-08-25 20:21:06 -04:00
Mo Tarbin
77b3430339 Adjust BottomSheetModal minHeight and add margin to toggle button; add 'Upgrade to Plus' option in NavBar 2025-08-23 17:17:02 -04:00
Mo Tarbin
0f125cd63f Enhance modal components with consistent button sizes and improve calendar styles for better responsiveness and layout 2025-08-23 17:15:18 -04:00
Mo Tarbin
65f84b116f Refactor chore components and enhance scheduling features
- Removed redundant priority color function from CompactChoreCard and imported from Colors utility.
- Replaced FadeModal with ResponsiveModal in MultiSelectHelp for improved modal handling.
- Simplified MyChores component by removing archived chores state and related logic, and added keyboard shortcut for navigating to archived tasks.
- Integrated ResponsiveModal in RedeemPointsModal for consistent modal usage.
- Added quick scheduling options in ChoreActionMenu for better task management, including scheduling for today, tomorrow, weekend, and next week.
- Enhanced CustomParsers to support nth occurrence of days in monthly scheduling.
- Updated NavBar links and navigation logic for improved user experience.
2025-08-22 23:37:30 -04:00
Mo Tarbin
2d008a5cc3 Refactor EditThingStateModal to use ResponsiveModal for improved consistency 2025-08-21 01:39:25 -04:00
Mo Tarbin
4dcd4483e9 Refactor modals to use ResponsiveModal for improved responsiveness and consistency 2025-08-21 01:39:03 -04:00
Mo Tarbin
0102ce2144 Add BottomSheetModal component and implement calendar view in MyChores 2025-08-21 00:34:00 -04:00
Mo Tarbin
71d5887bcc Refactor calendar components: implement responsive design, enhance layout, and integrate monthly view with chore prioritization 2025-08-20 18:17:12 -04:00
Mo Tarbin
76ce301d91 Add success notification for task unplanned event in MyChores component 2025-08-19 01:11:44 -04:00
Mo Tarbin
692ccd7838 Add ApproveChore and RejectChore functions; update ActivityItem to handle Pending Approval and Rejected statuses 2025-08-17 22:28:44 -04:00
Mo Tarbin
bf97b1c115 Refactor Chores module: enhance grouping logic to include Pending Approval status and improve status categorization 2025-08-17 22:28:23 -04:00
Mo Tarbin
6eda3c68a8 Refactor chore management features to support approval and rejection workflows
- Updated RepeatSection to use occurrences instead of dayOccurrences for scheduling.
- Enhanced ChoreCard and CompactChoreCard to include approve/reject functionality for pending chores.
- Implemented user role checks for approval/rejection capabilities.
- Improved UI elements to reflect pending approval states with appropriate icons.
- Modified ChoreHistory and ThingsHistory components for better data representation and layout.
- Cleaned up unused imports and commented-out code for better readability.
2025-08-17 22:27:58 -04:00
Mo Tarbin
ca9a53bde9 CalendarView component: add priority color to show in the calendar cell, legend display to show two columns instead of one 2025-08-17 22:26:04 -04:00
Mo Tarbin
9b9327c25e Refactor ChoreEdit component: improve section toggle styling and remove unnecessary padding 2025-08-16 01:54:56 -04:00
Mo Tarbin
a2be4c73a1 Test Adding collapsible sections to ChoreEdit component for better organization and navigation 2025-08-16 01:42:17 -04:00
Mo Tarbin
720987197d Refactor ChoreEdit component: reorganize sections, enhance UI elements, and improve task assignment features 2025-08-16 01:41:54 -04:00
Mo Tarbin
c52e83fe10 Enhance ChoreEdit component with approval and visibility options 2025-08-16 01:20:18 -04:00
Mo Tarbin
e97e03b814 Refactor: reorder imports and clean up whitespace in PageTransition component 2025-08-11 17:01:27 -04:00
Mo Tarbin
ac9b85e10b enhance repeat section with week patterns and day occurrence options 2025-08-09 22:34:21 -04:00
Mo Tarbin
8e80af657f Merge branch 'main' into dev 2025-08-09 22:25:23 -04:00
Mo Tarbin
93f9afd98d Fix: use optional chaining for notificationMetadata properties 2025-08-09 00:14:06 -04:00
Mo Tarbin
c9178db87d Enhance Settings, Things History, User Activities, and User Points views
- Integrated RevenueCat for subscription management in Settings.
- Added subscription and user deletion modals in Settings.
- Improved analytics display in Things History with update frequency and trend calculations.
- Enhanced User Activities timeline with a more structured layout.
- Revamped User Points section with a leaderboard and detailed points analytics.
- Introduced responsive design elements and improved user experience across various components.
- Add permission for Camera to support uploading photo via camera
2025-08-04 22:25:30 -04:00
Mo Tarbin
18743f66e8 Merge branch 'dev' 2025-07-29 00:07:15 -04:00
Mo Tarbin
72ae2ec5c4 chore: bump version to 0.1.107 in package.json 2025-07-28 23:57:40 -04:00
Mo Tarbin
0a407d869e Fix: include notificationMetadata in chore creation when dueDate is set
Fix: https://github.com/donetick/donetick/issues/273
https://github.com/donetick/donetick/issues/272
2025-07-28 23:57:06 -04:00
Mo Tarbin
8c8b684cb4 initialize subTasks state with an empty array if not provided in response 2025-07-28 23:36:17 -04:00
Mo Tarbin
63d1b86b5e Merge branch 'dev' 2025-07-20 10:41:42 -04:00
Mo Tarbin
49a9055a73 chore: bump version to 0.1.106 in package.json 2025-07-20 10:41:28 -04:00
Mo Tarbin
4f444bd3c9 Feature: implement useThingHistory hook and refactor ThingsHistory component for improved data fetching and rendering 2025-07-20 10:41:14 -04:00
Mo Tarbin
1efab98f91 Merge branch 'dev' 2025-07-19 01:18:31 -04:00
Mo Tarbin
b8677b4c02 Fix: update FadeModal to use named import for Z_INDEX and remove redundant zIndex property( it was hiding select input when create label) 2025-07-19 01:18:21 -04:00
Mo Tarbin
e6400d8305 Merge branch 'dev' 2025-07-19 00:55:56 -04:00
Mo Tarbin
7bdfdcc1f8 Fix: text highlighting in SmartTaskTitleInput to support recurring events 2025-07-19 00:49:09 -04:00
Mo Tarbin
9d9c12a52d Merge branch 'dev' 2025-07-15 07:58:16 -04:00
Mo Tarbin
1aa9da57aa Update NavBar drawer content positioning for improved layout 2025-07-15 07:58:04 -04:00
Mo Tarbin
0b57e42652 Merge branch 'dev' 2025-07-14 02:05:52 -04:00
Mo Tarbin
9a988e82c4 Refactor z-index management by introducing Z_INDEX constants and updating components to use them for consistent layering 2025-07-14 00:53:56 -04:00
Mo Tarbin
9e83448cd0 Fix Duedate not being populated.
showing the user names on choreEdit
2025-07-13 14:00:06 -04:00
Mo Tarbin
8d9a3cbb1e Merge branch 'dev' 2025-07-13 01:32:57 -04:00
Mo Tarbin
fc5a40ace0 bump version to 0.1.105 2025-07-13 01:32:48 -04:00
Mo Tarbin
9f2d0b5b07 Merge branch 'dev' 2025-07-13 01:30:38 -04:00
Mo Tarbin
7e98e98ad0 update NetworkBanner positioning and zIndex for improved visibility 2025-07-13 01:30:24 -04:00
Mo Tarbin
f6085aa89b Merge branch 'dev' 2025-07-13 00:50:48 -04:00
Mo Tarbin
32905aa16b Merge branch 'page-motion' into dev 2025-07-13 00:50:22 -04:00
Mo Tarbin
8a240d506b Merge branch 'dev' 2025-07-13 00:35:22 -04:00
Mo Tarbin
b6f07fdf85 adjust NavBar positioning for improved layout and responsiveness 2025-07-13 00:26:53 -04:00
Mo Tarbin
9a7ab172ac style: update color properties in TimerDetails component for consistency 2025-07-12 19:24:49 -04:00
Mo Tarbin
3d6c70629d only show notification about event from other users 2025-07-12 19:23:34 -04:00
Mo Tarbin
c8d13a6fa1 Merge branch 'dev' 2025-07-12 16:37:04 -04:00
Mo Tarbin
b24ac01493 style: adjust padding-top in NavBar component for improved layout 2025-07-12 16:36:53 -04:00
Mo Tarbin
be21da5e3b implement custom useTimer hook for improved timer functionality 2025-07-12 16:36:41 -04:00
Mo Tarbin
b6fea7dc9b Merge branch 'dev' 2025-07-12 02:43:16 -04:00
Mo Tarbin
adc2e96bf2 refactor: clean up whitespace and improve comments in StatusBarManager 2025-07-12 02:43:07 -04:00
Mo Tarbin
807dc612a7 Merge branch 'dev' 2025-07-12 02:19:46 -04:00
Mo Tarbin
1612de8231 style: update NavBar component with improved padding and sticky positioning 2025-07-12 02:19:39 -04:00
Mo Tarbin
4576ddf09c Merge branch 'dev' 2025-07-12 00:41:31 -04:00
Mo Tarbin
bb96de47be refactor: remove redundant comment in getIdFromTemplate function 2025-07-12 00:38:30 -04:00
Mo Tarbin
ccfc56e629 fix: notification ID generation and clean up scheduleChoreNotification function 2025-07-12 00:36:45 -04:00
Mo Tarbin
e6cde49247 feat: Add KeyboardShortcutHint component for displaying keyboard shortcuts on non-mobile devices 2025-07-11 20:37:41 -04:00
Mo Tarbin
1de41a8d24 feat: Implement swipe functionality for CompactChoreCard with action buttons for start, pause, edit, and delete 2025-07-11 20:11:42 -04:00
Mo Tarbin
953c62cc66 feat: Enhance UserPoints component with improved filtering and layout
- Updated UserPoints component to include a more user-friendly filter bar with enhanced styling.
- Added a summary section to display the current filter context.
- Refactored user selection and time period filtering logic for better clarity and performance.
- Improved the layout of points cards and history sections for better visual hierarchy.
- Integrated a bar chart for visual representation of points over time.
- Updated redeem points functionality with better user feedback.

feat: Add keyboard shortcuts in AddTaskModal for improved usability

- Implemented keyboard shortcuts for adding descriptions, subtasks, and due dates.
- Enhanced user experience by providing visual hints for keyboard shortcuts.
- Refactored task creation logic to streamline the process.

fix: Refactor ChoreActionMenu to handle mouse events and improve accessibility

- Added mouse enter and leave event handlers for better interaction feedback.
- Adjusted menu positioning for improved usability.

refactor: Update RichTextEditor to support focus handling from parent components

- Converted RichTextEditor to use forwardRef for better integration with parent components.
- Exposed focus and blur methods for external control.
- Improved image upload handling with better error management.

fix: Adjust SubTask component to handle Enter key behavior correctly

- Modified key event handling to prevent unintended task creation when holding meta or ctrl keys.
- Added autoFocus prop to new task input for better user experience.
2025-07-11 20:10:28 -04:00
Mo Tarbin
c2f5569010 feat: add TimerEditModal component for managing timer sessions with real-time updates and editing capabilities 2025-07-09 21:23:34 -04:00
Mo Tarbin
baef35d263 refactor: update App component to use QueryClient and improve theme handling; enhance ChoreView and SubTask components with performers data 2025-07-09 21:02:55 -04:00
Mo Tarbin
8b8345d0e6 Refactor modals to use FadeModal component for consistent styling and improved user experience
- fix https://github.com/donetick/donetick/issues/222

- Replaced Modal and ModalDialog with FadeModal in LabelModal, PasswordChangeModal, SelectModal, TextModal, UserModal, WriteNFCModal, RedeemPointsModal, and AddTaskModal.
- Updated modal structure and layout to maintain functionality while enhancing visual consistency.
- Removed unused imports and commented-out code for cleaner codebase.
2025-06-27 01:42:38 -04:00
Mo Tarbin
3bab677607 Merge branch 'dev' 2025-06-23 01:55:38 -04:00
Mo Tarbin
79362162d2 refactor CookiePermissionSnackbar to use Snackbar directly and remove notification provider 2025-06-23 01:55:32 -04:00
Mo Tarbin
ca537c6321 Merge branch 'dev' 2025-06-23 01:47:51 -04:00
Mo Tarbin
79382ce6f8 fix: update build-selfhosted script to include package-lock.json cleanup and dependency installation 2025-06-23 01:47:45 -04:00
Mo Tarbin
ea70aa21a9 Merge branch 'dev' 2025-06-23 01:15:42 -04:00
Mo Tarbin
e9f1b2a9b4 fix: refactor getDefaultNotification to retrieve from localStorage and update notificationMetadata initialization 2025-06-23 00:54:05 -04:00
Mo Tarbin
981513086b fix: update version to 0.1.104 in package.json 2025-06-23 00:50:14 -04:00
Mo Tarbin
9f4bfe75d1 fix: remove rollup from dependencies and optionalDependencies in package.json 2025-06-22 22:08:33 -04:00
Mo Tarbin
dcd8bbbd01 fix: update build-cf script to remove unnecessary node_modules cleanup 2025-06-22 22:04:09 -04:00
Mo Tarbin
cadfa5e034 fix: update build commands and add optional dependencies for cross-platform support 2025-06-22 22:00:40 -04:00
Mo Tarbin
76ea0c4978 fix: update package.json and package-lock.json to include optional rollup and swc dependencies for darwin arm64 2025-06-22 21:51:20 -04:00
Mo Tarbin
c1321203c1 fix: update rollup and swc dependencies for darwin arm64 support 2025-06-22 21:45:33 -04:00
Mo Tarbin
a8388db1c3 add rollup as a dependency in package.json 2025-06-22 17:30:55 -04:00
Mo Tarbin
f0589c2f33 chore: remove unnecessary rollup dependency for darwin arm64 2025-06-22 17:28:20 -04:00
Mo Tarbin
fbe7d64d5d Merge branch 'dev' 2025-06-22 17:24:42 -04:00
Mo Tarbin
a5722b2445 refactor: simplify notification titles in ThingsView component 2025-06-22 17:24:10 -04:00
Mo Tarbin
18e57e20ed update dependencies to include rollup for darwin arm64 and swc core 2025-06-22 17:22:32 -04:00
Mo Tarbin
5b83bf35d0 update notification handling and improve sorting logic in NotificationTemplate component 2025-06-22 17:21:22 -04:00
Mo Tarbin
97fb8d8561 chore: update package.json to specify Node and npm engine requirements, and add build-cf script for clean build 2025-06-21 01:24:14 -04:00
Mo Tarbin
fe5a72ae90 Merge branch 'dev' 2025-06-21 01:19:56 -04:00
Mo Tarbin
643a48afec Update package lock 2025-06-21 01:19:40 -04:00
Mo Tarbin
e50598dfa3 Merge branch 'dev' 2025-06-21 01:12:57 -04:00
Mo Tarbin
46fb1f0ac0 chore: Bump version to 0.1.103 in package.json 2025-06-21 01:10:46 -04:00
Mo Tarbin
eaaeee6ee7 Merge branch 'dev' 2025-06-21 00:38:14 -04:00
Mo Tarbin
522c5562eb feat: Add dark mode toggle button in HomeHero component 2025-06-21 00:15:27 -04:00
Mo Tarbin
ef8c63c176 Add dark mode screenshot and enhance image styling in HomeHero component 2025-06-21 00:07:31 -04:00
Mo Tarbin
12537ec7f3 feat: Add dark mode support for screenshot in HomeHero component 2025-06-21 00:00:49 -04:00
Mo Tarbin
8b791ed19e Update button variant and remove unnecessary styles in CompactChoreCard 2025-06-20 23:55:18 -04:00
Mo Tarbin
a1fdd0c0d2 fix: Add userId to users array in DemoMyChore component 2025-06-20 23:54:55 -04:00
Mo Tarbin
0b7097082d refactor: Update export order of animation components for consistency 2025-06-20 00:38:27 -04:00
Mo Tarbin
c903192d7c Add confirmation modals for token removal and storage clearing actions 2025-06-19 12:40:33 -04:00
Mo Tarbin
d8b5e0f5a1 Enhance CompactChoreCard and MyChores with animated transitions for multi-select and search filter 2025-06-19 02:24:39 -04:00
Mo Tarbin
fb8d476c34 Add more keyboard shortcuts for search focus and multi-select mode toggle in MyChores 2025-06-19 01:32:29 -04:00
Mo Tarbin
b4652e2486 feat: Add animation components and global styles for improved UX 2025-06-18 01:19:52 -04:00
Mo Tarbin
b0d37dc997 feat: Add animation components and loading screen; implement page transitions and staggered animations 2025-06-18 01:19:14 -04:00
Mo Tarbin
778930015e refactor: Remove debug log from useSSEContext hook 2025-06-18 00:24:28 -04:00
Mo Tarbin
fb8c45a86d refactor: Remove unused user profile references and improve SSE/WebSocket connection logic 2025-06-18 00:19:18 -04:00
Mo Tarbin
13b0533277 feat: Add image compression for profile photo uploads to reduce file size 2025-06-17 18:23:43 -04:00
Mo Tarbin
6cb6b1534d Websocket and SSE in working state :
Add Server-Sent Events (SSE) support with connection status and settings components

- Implemented SSEConnectionStatus component to display real-time connection status.
- Created SSESettings component for enabling/disabling SSE based on user profile.
- Introduced SSEContext and useSSE hook for managing SSE connections and state.
- Added auto-connect functionality for SSE based on user profile and token validity.
- Updated WebSocketSettings to ensure proper handling of WebSocket state.
- Enhanced MyChores view with bulk archive functionality and improved UI feedback.
- Refactored NotificationSetting to ensure boolean values are set correctly.
- Updated Settings view to include RealTimeSettings component for SSE configuration.
2025-06-17 01:07:14 -04:00
Mo Tarbin
4098f2e498 feat: Implement multi-select functionality with keyboard shortcuts and bulk actions 2025-06-17 01:00:39 -04:00
Mo Tarbin
19093a4ead Merge branch 'websocket-support' into dev 2025-06-14 00:06:28 -04:00
Mo Tarbin
c7e2cb9d06 fix: Adjust error message formatting for better readability in multiple components 2025-06-14 00:06:25 -04:00
Mo Tarbin
6be22170d8 Enhance MFASettings alert styling and update ProfileSettings notification handling 2025-06-13 23:53:42 -04:00
Mo Tarbin
2077b0ab4c Refactor error handling and notification system
- Removed the ErrorProvider component and replaced it with a unified NotificationProvider.
- Updated all components to utilize the new NotificationProvider for displaying notifications.
- Enhanced notification types to include success, error, warning, and info with customizable messages and titles.
- Removed Snackbar components from various views and replaced them with calls to the NotificationProvider.
- Updated the ForgotPasswordView, LoginView, SignupView, and other components to handle notifications more effectively.
- Improved user experience by providing consistent notification handling across the application.
2025-06-13 23:52:02 -04:00
Mo Tarbin
bc2ca86a95 Update priority colors in Colors utility and adjust usage in CompactChoreCard 2025-06-13 17:14:55 -04:00
Mo Tarbin
a443582ca9 Implement WebSocket connection management and settings UI 2025-06-13 16:38:34 -04:00
Mo Tarbin
2162397575 Add updatedAt timestamp to UpdateChoreAssignee and UpdateDueDate functions 2025-06-10 18:55:46 -04:00
Mo Tarbin
6cfb32570b merging dev 2025-06-08 12:14:00 -04:00
Mo Tarbin
a8d66fd0a4 Merge branch 'dev' 2025-06-08 12:08:39 -04:00
Mo Tarbin
b46d3d28a9 refactor: Consolidate imports for useCircleMembers and useUserProfile in UserPoints component 2025-06-08 10:51:08 -04:00
Mo Tarbin
44372059cd refactor: Replace UserContext with useUserProfile hook in UserPoints component 2025-06-08 02:20:25 -04:00
Mo Tarbin
64668147d9 refactor: Remove UserContext as it is no longer needed 2025-06-08 02:19:33 -04:00
Mo Tarbin
e21e71b442 feat: Refactor user profile management and improve token validation
- Introduced `useUserProfile` hook to centralize user profile fetching and management.
- Updated various components to utilize the new `useUserProfile` hook instead of context.
- Enhanced token validation logic in `Fetch` function to prevent unnecessary redirects.
- Added `parseDueDate` function to handle due date parsing with improved logic.
- Cleaned up user profile state management across multiple views and settings.
- Improved loading states and error handling in user-related components.
- remove usercontext and just use react query for userProfile
2025-06-08 02:09:23 -04:00
Mo Tarbin
10f646f125 refactor: Update LoginView to use useUserProfile hook and clean up user profile handling
- fix bug cause navigation loop
2025-06-08 02:07:33 -04:00
Mo Tarbin
187b76e04c feat: Integrate NotificationTemplate component into ChoreEdit and AddTaskModal for enhanced notification management 2025-06-08 02:05:59 -04:00
Mo Tarbin
f2c36cae37 fix: Add overflowX hidden to Box in Sidepanel for improved layout 2025-06-04 00:33:05 -04:00
Mo Tarbin
77a6357ae4 Merge branch 'dev' 2025-06-03 23:43:57 -04:00
Mo Tarbin
6c1be53f86 refactor: Rename parameter in CompleteSubTask back to completedAt to match backend https://github.com/donetick/donetick/issues/224 2025-06-03 23:33:55 -04:00
Sebastiaan ten Pas
59e02f047b fix: change Notificaiton to Notification 2025-06-03 13:02:43 +01:00
Mo Tarbin
321250f30e refactor: Update due date display logic and fix performer ID reference in ChoreCard component 2025-06-03 00:22:48 -04:00
Mo Tarbin
7559036abe refactor: Update chore grouping and color constants for improved clarity and organization 2025-06-03 00:18:51 -04:00
Mo Tarbin
6080b57f8a Merge branch 'dev' 2025-06-01 00:47:57 -04:00
Mo Tarbin
ddf654a641 refactor: Consolidate chore action handling into ChoreActionMenu component and remove unused code from ChoreCard and CompactChoreCard 2025-06-01 00:47:47 -04:00
Mo Tarbin
bf8e187962 Merge branch 'dev' 2025-05-31 19:40:34 -04:00
Mo Tarbin
cf252c3ec4 refactor: Clean up unused code and improve layout in CompactChoreCard, MyChores, and AddTaskModal components 2025-05-31 19:40:23 -04:00
Mo Tarbin
d65541fb3e refactor: Simplify user data fetching in MyChores component and update performer assignment logic ( cause a racing condition where sometime no task shown) 2025-05-31 17:18:17 -04:00
Mo Tarbin
20ef99cfc7 refactor: Remove debug console logs from WelcomeCard component 2025-05-31 16:46:02 -04:00
Mo Tarbin
87a003918d Merge branch 'dev' 2025-05-31 03:42:53 -04:00
Mo Tarbin
f5c3c90f37 fix: Update legend item assignee in CalendarView 2025-05-31 03:42:01 -04:00
Mo Tarbin
ee690092ba Merge branch 'main' of https://github.com/Donetick/frontend 2025-05-31 01:40:52 -04:00
Mo Tarbin
34a386abce feat: Implement Multi-Factor Authentication (MFA) flow in LoginView and add MFA settings page
- Added MFA verification modal to handle MFA during login.
- Integrated MFA checks in login and OAuth login processes.
- Created MFASettings component to manage MFA setup, enabling, disabling, and backup codes.
- Updated ProfileSettings to include timezone selection.
- Enhanced CalendarView to display assignee names with avatars.
- Added RichTextEditor enhancements for image uploads based on user account type.
- Minor adjustments to ChoreEdit and ChoreView components for better UX.
2025-05-31 01:36:55 -04:00
Mo Tarbin
05f4c42bf9 Enhance user experience with Plus feature notifications and improve code structure
- Updated ChoreEdit and RepeatSection components to provide clearer messaging for Basic plan users regarding Plus features.
- Introduced CompactChoreCard component to streamline chore display options in MyChores.
- Implemented view mode toggle in MyChores for better user preference handling.
- Refactored StorageSettings to conditionally display storage usage information based on user plan.
- Improved error handling and user feedback across various components.
2025-05-30 14:46:26 -04:00
Mo Tarbin
1510dc9bc2 Only show " Nothing scheduled" when there really nothing to show. fix where it was shown with archive tasks 2025-05-29 01:32:37 -04:00
Mo Tarbin
2a85b621f5 style: update Calendar styles for improved UI consistency; enhance CalendarView layout and chore display logic 2025-05-29 01:02:19 -04:00
Mo Tarbin
97abf2f230 fix: update CompleteSubTask parameter name and adjust body payload; enhance Sidepanel layout and restore ActivitiesCard position; modify WelcomeCard styles for improved UI consistency 2025-05-29 01:02:12 -04:00
Mo Tarbin
1f2d38730d feat: implement ActivitiesCard component to display recent activities with enhanced status and time display
Support the new Status and Performed By
2025-05-29 01:01:07 -04:00
Mo Tarbin
5c000f50aa feat: enhance Sidepanel with chore history integration and improve Calendar styles 2025-05-28 00:45:25 -04:00
Mo Tarbin
581931b679 Improve calendar styles and improve chore display logic in CalendarView 2025-05-28 00:11:46 -04:00
Mo Tarbin
709a91b1db Your commit message 2025-05-27 11:58:52 -04:00
Mo Tarbin
6ddb8d01ec feat: add profile and storage settings components, integrate rich text editor, and implement image compression for uploads 2025-05-27 02:18:59 -04:00
Mo Tarbin
81d3144da2 Fix and populating timezone. https://github.com/donetick/donetick/issues/197 2025-05-26 01:45:56 -04:00
Mohamad Tarbin
be2e8b7169 Merge pull request #23 from ssddanbrown/homepage_grammar
Fixed & adjusted a range of casing/wording on the homepage
2025-05-16 22:08:53 -04:00
Mo Tarbin
a21774031b Packagelock 2025-05-16 21:16:52 -04:00
Mo Tarbin
de4dc9b9a0 fix: update version to 0.1.101 in package-lock.json 2025-05-16 20:48:08 -04:00
Mo Tarbin
7ae2859c78 fix: update version to 0.1.101 in package.json 2025-05-16 20:38:50 -04:00
Mo Tarbin
8228472031 fix: integrate useResource hook in App component and update queryKey in useResource 2025-05-16 20:38:00 -04:00
Dan Brown
7ca5a2bd02 Fixed & adjusted a range of casing/wording on the homepage 2025-05-07 14:56:25 +01:00
Mo Tarbin
8858c7f619 Support cloning task https://github.com/donetick/donetick/issues/200 2025-05-07 00:28:23 -04:00
Mo Tarbin
992d7e3303 fix: update ApiManager to handle navigation on 401 Unauthorized responses and navigation for login 2025-05-07 00:21:36 -04:00
Mo Tarbin
bce135cba8 fix: improve date comparison in CalendarView 2025-05-07 00:19:54 -04:00
Mo Tarbin
8c30bedefb Fix authentication with OIDC 2025-05-07 00:05:44 -04:00
Mo Tarbin
e26f2910f3 style: remove fixed height from task input for better responsiveness 2025-04-24 22:10:30 -04:00
Mo Tarbin
0b1208a11c fix: update variable names in renderHighlightedSentence for clarity 2025-04-24 21:56:07 -04:00
Mo Tarbin
261919f17a refactor: update priority parsing to use '!' prefix and enhance highlight handling in CustomParsers 2025-04-24 21:34:07 -04:00
Mo Tarbin
4206cbd557 chore: update dependencies to version 7.0.0 and above, including Capacitor packages and MUI icons 2025-04-24 20:51:01 -04:00
Mo Tarbin
f537a00409 Enhance highlight parsing logic with priority handling and improve repeat match extraction in CustomParsers 2025-04-24 19:50:47 -04:00
Mo Tarbin
c1f2c062fe Add SmartTaskInput with Custom Renderer.
Change to use `@tanstack/react-query`
Add Global ErrorProvider
Add limited Support for offline version
Fix issue with calendar display +1 day
2025-04-24 19:14:17 -04:00
Mo Tarbin
0ad136fcc6 Refactor to use @tanstack/react-query for data fetching in various components 2025-04-24 01:45:59 -04:00
Mohamad Tarbin
edc203c9ed Merge pull request #22 from donetick/smart-text-field
Smart Input Field and Limit offline support
2025-04-24 01:15:38 -04:00
Mo Tarbin
03fbceccaa Merge branch 'main' into dev 2025-04-24 01:13:46 -04:00
Mo Tarbin
f0e0c0e4fc Add SmartTaskInput with Custom Renderer.
Change to use `@tanstack/react-query`
Add Global ErrorProvider
Add limited Support for offline version
Fix issue with calendar display +1 day
2025-04-24 01:03:40 -04:00
Mo Tarbin
4f1715913e Co-authored-by: Majicmaj <majicmaj@users.noreply.github.com> 2025-04-19 11:58:48 -04:00
Mo Tarbin
33d46209ef Add network management features and sync functionality; introduce NetworkBanner component 2025-04-12 01:03:00 -04:00
Mo Tarbin
06288af18d Fix #21 Frontend shows in calendar (Mon-Sun) the tasks delayed by one day 2025-04-06 19:40:12 -04:00
Mo Tarbin
c3d0fbaf06 Refactor frequency handling in ChoreEdit and RepeatSection; add points display in ChoreCard 2025-03-24 01:27:31 -04:00
Mo Tarbin
91cb2106a9 Fix #166 Setting priority when creating task doesn't apply 2025-03-22 15:15:40 -04:00
Mo Tarbin
1b53a4db99 Merge branch 'dev' 2025-03-17 01:04:15 -04:00
Mo Tarbin
77464db1b0 Bump version to 0.1.97 2025-03-17 01:04:04 -04:00
Mo Tarbin
36faaf0b97 Merge branch 'dev' 2025-03-17 01:03:05 -04:00
Mo Tarbin
e56893fd64 Add frequency and notification metadata to task input; update NavBar styles for improved layout 2025-03-17 01:02:52 -04:00
Mo Tarbin
c553e2077a Merge branch 'main' of https://github.com/Donetick/frontend 2025-03-05 22:06:09 -05:00
Mo Tarbin
76ed927839 Merge branch 'dev' 2025-03-05 22:04:36 -05:00
Mo Tarbin
08de84a889 Fix optional chaining for userProfile in chore filters and adjust data destructuring in MyChores component 2025-03-05 22:04:28 -05:00
Mo Tarbin
52b81cc115 Refactor MyChores component to include chore filters in ChoresGrouper calls 2025-03-05 21:41:32 -05:00
Mo Tarbin
de08c6c5b1 Enhance ChoresGrouper to include chore filters and update localStorage handling for selectedChoreFilter 2025-03-05 21:40:47 -05:00
Mo Tarbin
ee566bd2a3 Merge branch 'dev' 2025-03-05 21:06:32 -05:00
Mo Tarbin
9d8aec1aa6 Fix localStorage retrieval for selectedChoreFilter in MyChores component 2025-03-05 21:06:22 -05:00
Mohamad Tarbin
9dc8fe77bc Update README.md 2025-03-05 19:49:00 -05:00
Mohamad Tarbin
409851a64c Merge pull request #18 from ukr01/feature/SSO-Entropy-Fix
Adds 8 chars to state in call to custom auth provider instead of 6
2025-03-05 19:46:23 -05:00
Mo Tarbin
cd1b556fb1 Merge branch 'dev' 2025-03-05 19:45:38 -05:00
Mo Tarbin
d9de502894 Bump version to 0.1.96 2025-03-05 19:45:29 -05:00
Mo Tarbin
467fc935f0 - Support nest sub tasks
- Support filters in ChoreGrouper
- completion window only available if due date selected
- Add SortAndGrouping Component : support Filter by Assignee
- update Notification Switch to align left of the text
- Support caching filters
2025-03-05 19:43:43 -05:00
Mo Tarbin
a16309c69a - Support nest sub tasks
- Support filters in ChoreGrouper
- completion window only available if due date selected
- Add SortAndGrouping Component : support Filter by Assignee
- update Notification Switch to align left of the text
- Support caching filters
2025-03-05 19:43:32 -05:00
Ulrik Kristensen
a98f9c698b fixes randomState to have 8 chars instead of 6 2025-03-03 13:20:08 +01:00
Mo Tarbin
6431e7145d Bump version to 0.1.95 and add dnd-kit dependencies; implement CompleteSubTask function and enhance chore sorting logic 2025-02-25 23:40:26 -05:00
Mo Tarbin
bbea27d380 Bump version to 0.1.95 and add dnd-kit dependencies; implement CompleteSubTask function and enhance chore sorting logic 2025-02-25 23:39:59 -05:00
Mo Tarbin
e359b1c0a4 Fix #140 and add notification type as webhook only 2025-02-23 19:42:04 -05:00
Mo Tarbin
47348190ab Merge branch 'dev' 2025-02-15 00:05:51 -05:00
Mo Tarbin
cbf99fad18 Fix https://github.com/donetick/donetick/issues/128 2025-02-15 00:05:44 -05:00
Mo Tarbin
2162b8c22d Merge branch 'dev' of https://github.com/meauxt/donetick-frontend into dev 2025-02-15 00:05:12 -05:00
Mo Tarbin
967d13ebac Fix https://github.com/donetick/donetick/issues/128 2025-02-15 00:04:59 -05:00
Mo Tarbin
c06d5f1f30 Merge branch 'main' of https://github.com/meauxt/donetick-frontend 2025-02-12 22:26:32 -05:00
Mo Tarbin
46df52fddd Fix #124 unable to load settings 2025-02-12 22:25:56 -05:00
Mo Tarbin
5bf0724c2f Update webhook settings UI and functionality 2025-02-12 00:31:50 -05:00
Mo Tarbin
29252679a1 Merge branch 'main' of https://github.com/Donetick/frontend 2025-02-11 20:53:30 -05:00
Mo Tarbin
cfc121bbca Bump package version to 0.1.94 2025-02-11 20:50:00 -05:00
Mo Tarbin
e964985524 Update footer links and add EditThingStateModal component 2025-02-11 20:47:29 -05:00
Mo Tarbin
bf9ffc97f2 Add PutWebhookURL function to update user webhook URL 2025-02-11 20:46:58 -05:00
Mo Tarbin
d0b1addc6f Add Custom 404 to allow navigating back to login 2025-02-11 20:46:27 -05:00
Mo Tarbin
96c4d7e903 Fix #100 Completing On time task not moved to archive until refresh 2025-02-08 02:10:30 -05:00
Mohamad Tarbin
a17df7af88 Merge pull request #13 from dkhalife/dev/fix-typos
Fix typo in frequency and cleanup some dead code
2025-02-06 20:23:00 -05:00
Mohamad Tarbin
1bae178bc6 Merge pull request #12 from dkhalife/dev/add-ci
Add a build validation github action
2025-02-06 20:22:44 -05:00
Mo Tarbin
06519a0e5c Bump package version to 0.1.93 2025-02-06 20:22:07 -05:00
Mo Tarbin
bd49f4314d Add useResource hook for fetching resource data
Add Support or authenticating using OIDC
2025-02-06 19:35:33 -05:00
Mo Tarbin
0e0c43c4f5 Remove unused import and clean up code in UpdatePasswordView.jsx 2025-02-06 19:29:01 -05:00
Mo Tarbin
b221f38465 Update package version to 0.1.92 2025-02-02 10:52:13 -05:00
Mo Tarbin
d56c7a3bb4 Add loading spinner to ThingsHistory component 2025-02-02 10:47:47 -05:00
Mo Tarbin
568f86acd0 Update styling for NavBar and ThingsView components 2025-02-02 01:27:37 -05:00
Mo Tarbin
a57def2f92 Android app default route is /my/chores 2025-02-01 19:23:06 -05:00
Mo Tarbin
ba149d0e96 Make label Clickable
Fix changing URL for selfhosted
Update styling for calendar and thingview
2025-02-01 01:51:20 -05:00
Mo Tarbin
4527b229ed Merge branch 'dev' 2025-01-18 09:54:04 -05:00
Mo Tarbin
4e64d0b24e fix: Disable redeem button when points exceed available limit 2025-01-18 09:53:32 -05:00
Mo Tarbin
dfa5763605 Add Debounce, Add Description, fix TaskModal issue with every_other 2025-01-17 00:52:24 -05:00
Mo Tarbin
9dc3edb40e Update package version to 0.1.91 2025-01-17 00:50:36 -05:00
Mo Tarbin
2d4fb2b163 Add description field to ChoreEdit form and Choreview 2025-01-17 00:49:54 -05:00
Mo Tarbin
56f66e9e8f Add useDebounce hook for debouncing input values
Fix parsing
2025-01-16 00:41:04 -05:00
Mo Tarbin
aa7f412f14 Update prop names in IconButtonWithMenu to avoid conflicts 2025-01-15 02:03:59 -05:00
Mo Tarbin
9de1c79da6 Update IconButtonWithMenu to use shorter prop name to not conflict with the react key 2025-01-15 02:03:28 -05:00
Mo Tarbin
c8ac925146 Add IconButtonWithMenu component with label support
Add LearnMoreButton with some instruction on task modal
2025-01-15 01:54:28 -05:00
Mo Tarbin
da85caf684 Update IconButtonWithMenu to support label prop 2025-01-15 01:54:07 -05:00
Mo Tarbin
1b7751c5d1 Add LearnMoreButton component for displaying additional information 2025-01-15 01:53:55 -05:00
Mo Tarbin
93dfd84fa1 Make sure the title respect upper and lower case 2025-01-14 11:07:51 -05:00
Mo Tarbin
d3b36238d4 Make sure the title respect upper and lower case 2025-01-14 11:07:27 -05:00
Mo Tarbin
3706c66f5f Experiment: Add Sidepanel with calendar view
Support redeem points
Experiment: task in sentences
Fix small bugs in the chip when loading the chore card
2025-01-14 10:45:41 -05:00
Mo Tarbin
cc11a624ad Update Calendar.css styles for better readability 2025-01-14 02:30:41 -05:00
Mo Tarbin
62368b62b9 chore: Update package-lock.json version to 0.1.91 2025-01-14 02:13:56 -05:00
Mo Tarbin
52570a3bad Update npm dependencies to include chrono-node v2.7.7 2025-01-14 02:12:48 -05:00
Mo Tarbin
62696002e6 Add Task Modal for Task in a sentence 2025-01-14 02:12:27 -05:00
Mo Tarbin
27979ce869 Update ChoreEdit component to use 'Title' instead of 'Description' 2025-01-14 02:07:08 -05:00
Mo Tarbin
4a9f2263f2 Add Sidepanel component for displaying task and calendar view 2025-01-14 02:06:40 -05:00
Mo Tarbin
0d0855bbf9 Add RedeemPointsModal component for redeeming points 2025-01-14 02:03:56 -05:00
Mo Tarbin
1162d13dd8 feat: Add redeem points functionality and button for circle admin only admins 2025-01-14 02:03:42 -05:00
Dany Khalife
05cfa9e847 fix typo and cleanup 2025-01-11 08:55:03 -08:00
Dany Khalife
f2022c9360 add gh workflow 2025-01-11 08:39:59 -08:00
Mo Tarbin
1689e5eb9c fix wrong label when all months selected 2025-01-11 00:31:39 -05:00
Mo Tarbin
46f7f51d3a Fix the URl for google auth 2025-01-10 00:38:13 -05:00
Mo Tarbin
989137211e chore: Update Fetcher and TokenManager to use API v1 2025-01-02 23:13:17 -05:00
Mo Tarbin
13bfe66c9f chore: Update Fetcher and TokenManager to use API v1 2025-01-02 23:10:36 -05:00
Mohamad Tarbin
1d0f9ed1ed Merge pull request #8 from dkhalife/bugfix/handle-notification-target-failure
Bugfix: handle request error when updating notification type
2024-12-31 02:27:47 -05:00
Mohamad Tarbin
7c5f62e192 Merge pull request #7 from dkhalife/bugfix/comma-after-nav
Fix typo comma showing up in the nav
2024-12-31 02:26:23 -05:00
Mo Tarbin
68128c52e5 Fix import for LabelView 2024-12-31 02:25:31 -05:00
Mo Tarbin
c5e89c1fb6 Add Points view, Don't allow completion outside the completion window, migrate more things to react query 2024-12-31 02:23:21 -05:00
Mo Tarbin
1b1da5f3af Update Package.json 2024-12-31 02:22:21 -05:00
Mo Tarbin
32583b1a9e Add Points view, Don't allow completion outside the completion window, migrate more things to react query 2024-12-31 02:20:52 -05:00
Mo Tarbin
d98f4b599f Fix #65 missing based url from sign up
Add Support for CircleMember History in GetChoresHistory
2024-12-30 13:35:22 -05:00
Mo Tarbin
97f1c1b6f8 Initial Activity View
Add New Colors.jsx
Allow Dark model Toggle from the Navbar
2024-12-28 18:56:21 -05:00
Mo Tarbin
d4c36e2057 Initial Activity View
Add New Colors.jsx
Allow Dark model Toggle from the Navbar
2024-12-28 18:52:06 -05:00
Mo Tarbin
4fc836a34b Update custom server URL in TokenManager.jsx 2024-12-27 16:07:12 -05:00
Dany Khalife
562f5f66fe add error handling for notification setting update 2024-12-27 10:27:17 -08:00
Dany Khalife
357cf34b07 remove extra comma 2024-12-26 19:49:45 -08:00
Mo Tarbin
0f2781ff6a chore: Add reusify npm dependency for code optimization 2024-12-26 19:00:16 -05:00
Mo Tarbin
8f93cc5e62 Update maximum file size for caching in service worker to 6MB 2024-12-26 18:54:23 -05:00
Mohamad Tarbin
bcd32a8616 Mobile app (#3)
* Initial Capacitor Config and plugins

* Add Android project files and resources

* Add local notification scheduling for chores

* Add NotificationAccessSnackbar component for handling notification preferences

* Add capacitor-preferences to Android project

* Update notification Snackbar

* Add local notification scheduling for chores

* Add ionic.config.json file for custom project configuration

* chore: Add environment variables for production deployment

* Add Support for IOS, pass notificaiton token(push notifications)

* Add Capacitor Device support and refactor notification handling

* Refactor GoogleAuth client IDs to use environment variables

* Remove google-services.json to enhance security by eliminating sensitive data from the repository

* Remove environment files to enhance security by eliminating sensitive data from the repository

* Rename project from fe-template to Donetick in ionic.config.json

* Remove GoogleService-Info.plist and Info.plist to enhance security by eliminating sensitive data from the repository

---------

Co-authored-by: Mo Tarbin <mohamad@Mos-MacBook-Pro.local>
2024-12-26 02:13:47 -05:00
654 changed files with 113216 additions and 12249 deletions

2
.bundle/config Normal file
View File

@@ -0,0 +1,2 @@
---
BUNDLE_PATH: "vendor/bundle"

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
# EditorConfig is awesome: https://EditorConfig.org
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true

2
.env
View File

@@ -1,4 +1,4 @@
VITE_APP_API_URL=http://localhost:2021
VITE_IS_LANDING_DEFAULT=false
VITE_IS_LANDING_DEFAULT=true
VITE_OPENREPLAY_PROJECT_KEY=
VITE_IS_SELF_HOSTED=false

View File

@@ -1,4 +1,5 @@
VITE_APP_API_URL=http://localhost:2021
VITE_APP_REDIRECT_URL=http://localhost:5173
VITE_APP_GOOGLE_CLIENT_ID=USE_YOUR_OWN_CLIENT_ID
VITE_IS_SELF_HOSTED=true
VITE_IS_SELF_HOSTED=true
VITE_IS_LANDING_DEFAULT=true

View File

@@ -1,36 +0,0 @@
module.exports = {
root: true,
env: { browser: true, es2020: true },
extends: [
'eslint:recommended',
'plugin:react/recommended',
'plugin:react/jsx-runtime',
'plugin:react-hooks/recommended',
'plugin:prettier/recommended',
'plugin:tailwindcss/recommended',
],
ignorePatterns: [
'dist',
'.eslintrc.cjs',
'tailwind.config.js',
'postcss.config.js',
],
parserOptions: { ecmaVersion: 'latest', sourceType: 'module' },
settings: { react: { version: '18.2' } },
plugins: [
'react-refresh',
'simple-import-sort',
'sort-destructure-keys',
'sort-keys-fix',
'prettier',
'tailwindcss',
],
rules: {
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
'react/prop-types': 'off',
},
}

21
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,21 @@
name: Build validation
on:
push:
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- name: Use Node.js 20
uses: actions/setup-node@v7
with:
node-version: 20.x
cache: 'npm'
- name: Install dependencies
run: npm i
- run: npm run build
- run: npm run lint:ci

26
.gitignore vendored
View File

@@ -22,3 +22,29 @@ dist-ssr
*.njsproj
*.sln
*.sw?
resources/android/**/*
resources/ios/**/*
# Secrets (pulled via scripts/pull-secrets.sh)
.env.production
android/app/google-services.json
android/app/release/*.jks
android/keystore.properties
android/local.properties
android/play-service-account.json
ios/App/App/GoogleService-Info.plist
ios/*.p8
# Release build outputs
build/android
build/ios
fastlane/report.xml
fastlane/Preview.html
fastlane/.env
fastlane/*.log
vendor/bundle
# Claude Code skills cache
.agents/
skills-lock.json

2
.npmrc Normal file
View File

@@ -0,0 +1,2 @@
fund=false
audit=false

1
.nvmrc Normal file
View File

@@ -0,0 +1 @@
20

13
.prettierignore Normal file
View File

@@ -0,0 +1,13 @@
LICENSE.md
dist/
build/
vendor/
android/
ios/
resources/
.bundle/
.agents/
.impeccable/
package-lock.json
Gemfile.lock
skills-lock.json

View File

@@ -1,13 +0,0 @@
{
"arrowParens": "avoid",
"bracketSpacing": true,
"endOfLine": "auto",
"jsxBracketSameLine": false,
"printWidth": 80,
"semi": false,
"singleQuote": true,
"jsxSingleQuote": true,
"tabWidth": 2,
"trailingComma": "all",
"plugins": ["prettier-plugin-tailwindcss"]
}

87
AUTOMATED_RELEASE.md Normal file
View File

@@ -0,0 +1,87 @@
# Automated Release Pipeline
Builds and (optionally) uploads signed Android and iOS release artifacts from the CLI — no Android Studio or Xcode GUI needed for routine releases.
## Quick start
```sh
./scripts/pull-secrets.sh # pulls all signing secrets from Vaultwarden
./scripts/release.sh # bump patch version, build + sign both platforms
./scripts/release.sh --upload # also upload: Android → Play internal track, iOS → TestFlight
```
Common flags on `release.sh`:
| Flag | Effect |
| --------------------- | ----------------------------------------------------- |
| `--android` / `--ios` | Build only one platform |
| `--bump minor\|major` | Bump type (default: `patch`) |
| `--skip-bump` | Build with the current version, don't bump |
| `--upload` | Upload after building |
| `--track TRACK` | Play Store track for `--upload` (default: `internal`) |
Outputs:
- Android: `android/app/build/outputs/bundle/release/app-release.aab`
- iOS: `build/ios/Donetick.ipa`
## One-time machine setup
1. `bundle install` — installs fastlane (Ruby gems, local to the repo via `vendor/bundle`)
2. `./scripts/pull-secrets.sh` — pulls all secrets below from Vaultwarden
3. `android/local.properties` needs `sdk.dir=<path to Android SDK>` — not pulled from vault, machine-specific. Android Studio creates this automatically; if building headless-only, create it manually.
4. Export `ASC_ISSUER_ID` (App Store Connect API key issuer ID) — either in your shell profile, or add it to the `Donetick Env Production` vault note so `pull-secrets.sh` delivers it into `.env.production` (which `release.sh` auto-sources).
5. A working Apple Distribution certificate + the `Donetick App Store(fastline)` provisioning profile must be installed in your keychain / `~/Library/MobileDevice/Provisioning Profiles/` (see "iOS signing model" below) — **not** currently pulled from vault, machine-specific one-time setup.
## Secrets pulled by `scripts/pull-secrets.sh`
All secrets live in Vaultwarden (`https://www.bitwarden.com`) as Secure Notes, named exactly as below:
| Vault item name | Written to | Encoding |
| ------------------------------------ | ----------------------------------------------- | -------- |
| Donetick Google Services Android | `android/app/google-services.json` | raw |
| Donetick Android Keystore | `android/app/release/donetick.jks` | base64 |
| Donetick Keystore Password | (used inline for `android/keystore.properties`) | raw |
| Donetick Google Play Service Account | `android/play-service-account.json` | raw |
| Donetick Google Services iOS | `ios/App/App/GoogleService-Info.plist` | raw |
| Donetick App Store Connect Key | `ios/AuthKey_84F695CDQ3.p8` | base64 |
| Donetick Env Production | `.env.production` | raw |
None of these files are committed to git — all covered by `.gitignore`.
## iOS signing model (important — don't relitigate this)
The App target uses **manual signing for Release**, not Automatic. This was a deliberate choice, not the default:
- The project has **two** Apple Distribution-type certificates on the Apple Developer account: an Xcode Cloudmanaged one (private key never leaves Apple, can't be used for local CLI signing) and a plain one created via Xcode → Settings → Accounts → Manage Certificates (private key is in the local keychain, usable). Automatic signing kept binding to the wrong (Managed) one.
- Fix: `ios/App/App.xcodeproj/project.pbxproj` → App target → Release config has `CODE_SIGN_STYLE = Manual`, `CODE_SIGN_IDENTITY = "Apple Distribution"`, `PROVISIONING_PROFILE_SPECIFIER = "Donetick App Store(fastline)"`. Debug config is untouched (still Automatic, for local dev builds in Xcode).
- `fastlane/Fastfile`'s `ios release` lane passes explicit `export_options: { signingStyle: "manual", provisioningProfiles: {...} }` to `build_app` — do **not** switch this back to `-allowProvisioningUpdates`/automatic without a good reason, it re-triggers the ambiguous cert selection.
**If you ever add/change an entitlement** (new Capability in Signing & Capabilities, e.g. a new permission), the existing provisioning profile becomes stale and exports will fail with an error like `"App.app" requires a provisioning profile with the X feature`. Fix:
1. developer.apple.com → Identifiers → `com.donetick.app` → confirm the new capability is checked
2. developer.apple.com → Profiles → find `Donetick App Store(fastline)` → regenerate it → download
3. Install it locally: get its UUID (`security cms -D -i <file>.mobileprovision | plutil -extract UUID xml1 -o - -`) and copy to `~/Library/MobileDevice/Provisioning Profiles/<uuid>.mobileprovision`
**If the Distribution certificate ever expires/is revoked**, redo the one-time Xcode step: Settings → Accounts → Manage Certificates → `+` → Apple Distribution, then regenerate the profile as above.
## Android signing model
Standard keystore signing via `android/keystore.properties`, read by `android/app/build.gradle`. One historical gotcha already fixed: `storeFile` must be `release/donetick.jks` (relative to the `android/app` module dir), **not** `app/release/donetick.jks` — that extra `app/` silently resolved to a double-nested wrong path and broke CLI builds (Android Studio may have masked this before).
## Play Store upload gotchas
- The service account (`fastline-471@donetick-5f910.iam.gserviceaccount.com`) needs the **Google Play Android Developer API enabled** in its GCP project (`donetick-5f910`), **and** explicit per-app release permission granted in Play Console → Users and permissions (not just account-level access) — **and you have to actually click Save**, the UI will silently not persist it otherwise.
- Google Play Console permission changes can take time to propagate on Google's backend even after saving (historically documented as up to ~24h, though in practice it was near-instant once actually saved).
- The Play Developer API requires the app to have had **at least one manual release** uploaded through the Play Console website before API uploads work at all — not an issue for Donetick (already satisfied) but relevant if this is ever set up for a brand-new app.
## Fastlane lanes reference
```sh
bundle exec fastlane android release # build signed .aab
bundle exec fastlane android apk # build signed .apk (sideloading/testing)
bundle exec fastlane android upload [track:X] # upload .aab to Play Store (default track: internal)
bundle exec fastlane ios release # build signed .ipa
bundle exec fastlane ios upload # upload .ipa to TestFlight
```

3
Gemfile Normal file
View File

@@ -0,0 +1,3 @@
source "https://rubygems.org"
gem "fastlane"

233
Gemfile.lock Normal file
View File

@@ -0,0 +1,233 @@
GEM
remote: https://rubygems.org/
specs:
CFPropertyList (3.0.8)
abbrev (0.1.2)
addressable (2.9.0)
public_suffix (>= 2.0.2, < 8.0)
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.2)
aws-partitions (1.1109.0)
aws-sdk-core (3.224.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
base64
jmespath (~> 1, >= 1.6.1)
logger
aws-sdk-kms (1.101.0)
aws-sdk-core (~> 3, >= 3.216.0)
aws-sigv4 (~> 1.5)
aws-sdk-s3 (1.188.0)
aws-sdk-core (~> 3, >= 3.224.1)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
aws-sigv4 (1.11.0)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
claide (1.1.0)
colored (1.2)
colored2 (3.1.2)
commander (4.6.0)
highline (~> 2.0.0)
csv (3.3.5)
declarative (0.0.20)
digest-crc (0.7.0)
rake (>= 12.0.0, < 14.0.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
dotenv (2.8.1)
emoji_regex (3.2.3)
excon (0.109.0)
faraday (1.10.6)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
faraday-excon (~> 1.1)
faraday-httpclient (~> 1.0)
faraday-multipart (~> 1.0)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.0)
faraday-patron (~> 1.0)
faraday-rack (~> 1.0)
faraday-retry (~> 1.0)
ruby2_keywords (>= 0.0.4)
faraday-cookie_jar (0.0.8)
faraday (>= 0.8.0)
http-cookie (>= 1.0.0)
faraday-em_http (1.0.0)
faraday-em_synchrony (1.0.1)
faraday-excon (1.1.0)
faraday-httpclient (1.0.1)
faraday-multipart (1.2.0)
multipart-post (~> 2.0)
faraday-net_http (1.0.2)
faraday-net_http_persistent (1.2.0)
faraday-patron (1.0.0)
faraday-rack (1.0.0)
faraday-retry (1.0.4)
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.1)
fastlane (2.230.0)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
babosa (>= 1.0.3, < 2.0.0)
base64 (~> 0.2.0)
bundler (>= 1.12.0, < 3.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
dotenv (>= 2.1.1, < 3.0.0)
emoji_regex (>= 0.1, < 4.0)
excon (>= 0.71.0, < 1.0.0)
faraday (~> 1.0)
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
json (< 3.0.0)
jwt (>= 2.1.0, < 3)
logger (>= 1.6, < 2.0)
mini_magick (>= 4.9.4, < 5.0.0)
multipart-post (>= 2.0.0, < 3.0.0)
mutex_m (~> 0.3.0)
naturally (~> 2.2)
nkf (~> 0.2.0)
optparse (>= 0.1.1, < 1.0.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
simctl (~> 1.6.3)
terminal-notifier (>= 2.0.0, < 3.0.0)
terminal-table (~> 3)
tty-screen (>= 0.6.3, < 1.0.0)
tty-spinner (>= 0.8.0, < 1.0.0)
word_wrap (~> 1.0.0)
xcodeproj (>= 1.13.0, < 2.0.0)
xcpretty (~> 0.4.1)
xcpretty-travis-formatter (>= 0.0.3, < 2.0.0)
fastlane-sirp (1.1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
mini_mime (~> 1.0)
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.29.0)
google-apis-core (>= 0.11.0, < 2.a)
google-cloud-core (1.6.1)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-errors (1.3.1)
google-cloud-storage (1.45.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.29.0)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
http-cookie (1.0.8)
domain_name (~> 0.5)
httpclient (2.9.0)
mutex_m
jmespath (1.6.2)
json (2.7.6)
jwt (2.10.3)
base64
logger (1.7.0)
mini_magick (4.13.2)
mini_mime (1.1.5)
multi_json (1.15.0)
multipart-post (2.4.1)
mutex_m (0.3.0)
nanaimo (0.4.0)
naturally (2.3.0)
nkf (0.2.0)
optparse (0.8.1)
os (1.1.4)
plist (3.7.2)
public_suffix (5.1.1)
rake (13.4.2)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.8.0)
rexml (3.4.4)
rouge (3.28.0)
ruby2_keywords (0.0.5)
rubyzip (2.4.1)
security (0.1.5)
signet (0.18.0)
addressable (~> 2.8)
faraday (>= 0.17.5, < 3.a)
jwt (>= 1.5, < 3.0)
multi_json (~> 1.10)
simctl (1.6.10)
CFPropertyList
naturally
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.2)
tty-spinner (0.9.3)
tty-cursor (~> 0.7)
uber (0.1.0)
unf (0.2.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
xcodeproj (1.28.1)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
base64
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
nanaimo (~> 0.4.0)
nkf
rexml (>= 3.3.6, < 4.0)
xcpretty (0.4.1)
rouge (~> 3.28.0)
xcpretty-travis-formatter (1.0.1)
xcpretty (~> 0.2, >= 0.0.7)
PLATFORMS
ruby
DEPENDENCIES
fastlane
BUNDLED WITH
2.4.10

View File

@@ -20,12 +20,9 @@ As an avid for open-source, I was eager to create a solution that could benefit
- Recurring Tasks: Schedule tasks to repeat daily, weekly, monthly, or yearly, with flexible customization options.
- Progress Tracking: Track the completion status of tasks and view historical data.
## Installation
## Development Environment
1. Clone the repository:
2. Navigate to the project directory: `cd frontend`
3. Download dependency `npm install`
4. Run locally `npm start`
Follow the full instructions here: https://github.com/donetick/donetick?tab=readme-ov-file#development-environment
## Contributing
@@ -41,7 +38,7 @@ Contributions are welcome! If you would like to contribute to Donetick, please f
Donetick is a work in progress and has been a fantastic learning experience for me as I've honed my React skills,I'm looking for collaborators to help improve and refine the Donetick. Feel free to open PR or suggest changes.
## Plans :
## Plans:
My goal is to expand Donetick by offering a hosted infrastructure option. This will make it even easier for users to access and utilize Donetick's features without the need for self-hosting.
@@ -49,4 +46,4 @@ While maintaining Donetick's commitment to open source, this hosted option will
## License
This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for more details. I might consider changing it later to something else
This project is licensed under the AGPLv3 License. See the [LICENSE](LICENSE) file for more details. I might consider changing it later to something else

101
android/.gitignore vendored Normal file
View File

@@ -0,0 +1,101 @@
# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore
# Built application files
*.apk
*.aar
*.ap_
*.aab
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
bin/
gen/
out/
# Uncomment the following line in case you need and you don't have the release build type files in your app
# release/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
# Android Studio 3 in .gitignore file.
.idea/caches
.idea/modules.xml
# Comment next line if keeping position of elements in Navigation Editor is relevant for you
.idea/navEditor.xml
# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
.cxx/
# Google Services (e.g. APIs or Firebase)
# google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
# Version control
vcs.xml
# lint
lint/intermediates/
lint/generated/
lint/outputs/
lint/tmp/
# lint/reports/
# Android Profiling
*.hprof
# Cordova plugins for Capacitor
capacitor-cordova-android-plugins
# Copied web assets
app/src/main/assets/public
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml

2
android/app/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
/build/*
!/build/.npmkeep

71
android/app/build.gradle Normal file
View File

@@ -0,0 +1,71 @@
apply plugin: 'com.android.application'
def keystorePropertiesFile = rootProject.file("keystore.properties")
def keystoreProperties = new Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
android {
namespace "com.donetick.app"
compileSdk rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.donetick.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 70
versionName "1.2.49"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
signingConfigs {
release {
if (keystorePropertiesFile.exists()) {
storeFile file(keystoreProperties['storeFile'])
storePassword keystoreProperties['storePassword']
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
}
}
}
buildTypes {
release {
signingConfig keystorePropertiesFile.exists() ? signingConfigs.release : signingConfigs.debug
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
}
apply from: 'capacitor.build.gradle'
try {
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}

View File

@@ -0,0 +1,39 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
}
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies {
implementation project(':capacitor-community-in-app-review')
implementation project(':capacitor-community-speech-recognition')
implementation project(':capacitor-community-sqlite')
implementation project(':capacitor-app')
implementation project(':capacitor-browser')
implementation project(':capacitor-device')
implementation project(':capacitor-haptics')
implementation project(':capacitor-local-llm')
implementation project(':capacitor-local-notifications')
implementation project(':capacitor-network')
implementation project(':capacitor-preferences')
implementation project(':capacitor-push-notifications')
implementation project(':capacitor-share')
implementation project(':capacitor-status-bar')
implementation project(':capgo-capacitor-document-scanner')
implementation project(':capgo-capacitor-nfc')
implementation project(':capgo-capacitor-social-login')
implementation project(':jcesarmobile-capacitor-ocr')
implementation project(':revenuecat-purchases-capacitor')
implementation project(':revenuecat-purchases-capacitor-ui')
implementation project(':capacitor-plugin-safe-area')
}
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}

21
android/app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,33 @@
{
"version": 3,
"artifactType": {
"type": "APK",
"kind": "Directory"
},
"applicationId": "com.donetick.app",
"variantName": "release",
"elements": [
{
"type": "SINGLE",
"filters": [],
"attributes": [],
"versionCode": 25,
"versionName": "1.2.3",
"outputFile": "app-release.apk"
}
],
"elementType": "File",
"baselineProfiles": [
{
"minApi": 28,
"maxApi": 30,
"baselineProfiles": ["baselineProfiles/1/app-release.dm"]
},
{
"minApi": 31,
"maxApi": 2147483647,
"baselineProfiles": ["baselineProfiles/0/app-release.dm"]
}
],
"minSdkVersionForDexing": 28
}

View File

@@ -0,0 +1,26 @@
package com.getcapacitor.myapp;
import static org.junit.Assert.*;
import android.content.Context;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.getcapacitor.app", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,157 @@
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!-- Deep link intent filter for OAuth and other donetick:// URLs -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="donetick" />
</intent-filter>
<!-- Verified App Link for Circle invites hosted by Donetick Cloud. -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="app.donetick.com"
android:pathPrefix="/circle/join" />
</intent-filter>
<!-- NFC NDEF dispatch: open app directly when a donetick:// tag is scanned -->
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="donetick" />
</intent-filter>
</activity>
<!-- Home-screen widgets -->
<receiver
android:name=".widget.TodayWidgetProvider"
android:exported="false"
android:label="@string/widget_today_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_today_info" />
</receiver>
<receiver
android:name=".widget.WeekWidgetProvider"
android:exported="false"
android:label="@string/widget_week_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_week_info" />
</receiver>
<receiver
android:name=".widget.PeopleWidgetProvider"
android:exported="false"
android:label="@string/widget_people_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_people_info" />
</receiver>
<receiver
android:name=".widget.QuickCaptureWidgetProvider"
android:exported="false"
android:label="@string/widget_quick_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_quick_capture_info" />
</receiver>
<service
android:name=".widget.WidgetListService"
android:exported="false"
android:permission="android.permission.BIND_REMOTEVIEWS" />
<activity
android:name=".widget.WidgetConfigActivity"
android:exported="true"
android:theme="@style/AppTheme">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
</provider>
<!-- Push Notifications Icon -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@mipmap/ic_launcher" />
<!-- Push Notifications Color -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@android:color/white" />
</application>
<!-- Permissions -->
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<!-- Android 14+ partial photo access via system photo picker; no READ_MEDIA_IMAGES needed -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<!-- Explicitly block READ_MEDIA_IMAGES if any library injects it -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" tools:node="remove" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" tools:node="remove" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<!-- Remove advertising ID / Privacy Sandbox ad permissions if transitive SDKs inject them. -->
<uses-permission android:name="com.google.android.gms.permission.AD_ID" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_ATTRIBUTION" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_AD_ID" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_CUSTOM_AUDIENCE" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_ADSERVICES_TOPICS" tools:node="remove" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.NFC" />
<!-- Voice task capture -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<!-- Android 11+ package visibility for the system speech recognition service -->
<queries>
<intent>
<action android:name="android.speech.RecognitionService" />
</intent>
</queries>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@@ -0,0 +1,58 @@
package com.donetick.app;
import com.getcapacitor.BridgeActivity;
import ee.forgr.capacitor.social.login.GoogleProvider;
import ee.forgr.capacitor.social.login.SocialLoginPlugin;
import ee.forgr.capacitor.social.login.ModifiedMainActivityForSocialLoginPlugin;
import com.getcapacitor.PluginHandle;
import com.getcapacitor.Plugin;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.util.Log;
import com.donetick.app.widget.WidgetBridgePlugin;
public class MainActivity extends BridgeActivity implements ModifiedMainActivityForSocialLoginPlugin {
@Override
public void onCreate(Bundle savedInstanceState) {
registerPlugin(WidgetBridgePlugin.class);
super.onCreate(savedInstanceState);
}
// Capacitor only forwards ACTION_VIEW deep links, so normalize Donetick NFC intents before dispatch.
@Override
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_NDEF_DISCOVERED.equals(intent.getAction())
&& intent.getData() != null
&& "donetick".equals(intent.getData().getScheme())) {
intent.setAction(Intent.ACTION_VIEW);
}
super.onNewIntent(intent);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode >= GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MIN && requestCode < GoogleProvider.REQUEST_AUTHORIZE_GOOGLE_MAX) {
PluginHandle pluginHandle = getBridge().getPlugin("SocialLogin");
if (pluginHandle == null) {
Log.i("Google Activity Result", "SocialLogin login handle is null");
return;
}
Plugin plugin = pluginHandle.getInstance();
if (!(plugin instanceof SocialLoginPlugin)) {
Log.i("Google Activity Result", "SocialLogin plugin instance is not SocialLoginPlugin");
return;
}
((SocialLoginPlugin) plugin).handleGoogleLoginIntent(requestCode, data);
}
}
@Override
public void IHaveModifiedTheMainActivityForTheUseWithSocialLoginPlugin() {}
}

View File

@@ -0,0 +1,131 @@
package com.donetick.app.widget;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Locale;
/**
* Member avatars for the widgets: downloads and circle-crops profile photos
* (cached on disk for a day) and falls back to a colored initials disc.
* Downloads must only happen from a background/binder thread —
* RemoteViewsFactory.onDataSetChanged qualifies.
*/
final class AvatarCache {
private static final String TAG = "DonetickWidget";
private static final String DIR = "widget_avatars";
private static final long MAX_AGE_MS = 24 * 60 * 60 * 1000;
private static final int SIZE_PX = 96;
// Joy-ish palette for initials discs; picked by hashing the member id so
// each person keeps a stable color.
private static final int[] PALETTE = {
0xFF0B6BCB, 0xFF147D57, 0xFF9C4DD3, 0xFFC2410C,
0xFF0E7490, 0xFFB02A5B, 0xFF5B21B6, 0xFF937800,
};
private AvatarCache() {}
/** Photo avatar or null; never throws, never touches the network on failure loops. */
static Bitmap photo(Context context, WidgetStore.Member member) {
if (member == null || member.image == null || !member.image.startsWith("http")) {
return null;
}
try {
File dir = new File(context.getCacheDir(), DIR);
if (!dir.exists()) dir.mkdirs();
File file = new File(dir, member.id + ".png");
if (file.exists()
&& System.currentTimeMillis() - file.lastModified() < MAX_AGE_MS) {
return BitmapFactory.decodeFile(file.getAbsolutePath());
}
Bitmap downloaded = download(member.image);
if (downloaded == null) {
// Keep serving a stale copy rather than nothing.
return file.exists() ? BitmapFactory.decodeFile(file.getAbsolutePath()) : null;
}
Bitmap circled = circleCrop(downloaded);
try (FileOutputStream out = new FileOutputStream(file)) {
circled.compress(Bitmap.CompressFormat.PNG, 100, out);
}
return circled;
} catch (Exception e) {
Log.w(TAG, "Avatar load failed for member " + member.id, e);
return null;
}
}
/** Colored disc with the member's first initial — the no-photo fallback. */
static Bitmap initials(WidgetStore.Member member) {
String name = member != null && member.name != null ? member.name.trim() : "";
String letter = name.isEmpty()
? "?"
: new String(Character.toChars(name.codePointAt(0))).toUpperCase(Locale.getDefault());
int color = PALETTE[Math.abs((member != null ? member.id : "?").hashCode()) % PALETTE.length];
Bitmap bitmap = Bitmap.createBitmap(SIZE_PX, SIZE_PX, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(color);
canvas.drawCircle(SIZE_PX / 2f, SIZE_PX / 2f, SIZE_PX / 2f, paint);
Paint text = new Paint(Paint.ANTI_ALIAS_FLAG);
text.setColor(Color.WHITE);
text.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
text.setTextSize(SIZE_PX * 0.42f);
text.setTextAlign(Paint.Align.CENTER);
Rect bounds = new Rect();
text.getTextBounds(letter, 0, letter.length(), bounds);
canvas.drawText(letter, SIZE_PX / 2f, SIZE_PX / 2f + bounds.height() / 2f, text);
return bitmap;
}
/** Best avatar for a member: photo when available, initials otherwise. */
static Bitmap get(Context context, WidgetStore.Member member) {
Bitmap photo = photo(context, member);
return photo != null ? photo : initials(member);
}
private static Bitmap download(String imageUrl) {
HttpURLConnection connection = null;
try {
connection = (HttpURLConnection) new URL(imageUrl).openConnection();
connection.setConnectTimeout(8000);
connection.setReadTimeout(10000);
if (connection.getResponseCode() != 200) return null;
try (InputStream stream = connection.getInputStream()) {
Bitmap raw = BitmapFactory.decodeStream(stream);
if (raw == null) return null;
return Bitmap.createScaledBitmap(raw, SIZE_PX, SIZE_PX, true);
}
} catch (Exception e) {
Log.w(TAG, "Avatar download failed", e);
return null;
} finally {
if (connection != null) connection.disconnect();
}
}
private static Bitmap circleCrop(Bitmap source) {
Bitmap output = Bitmap.createBitmap(SIZE_PX, SIZE_PX, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
canvas.drawCircle(SIZE_PX / 2f, SIZE_PX / 2f, SIZE_PX / 2f, paint);
return output;
}
}

View File

@@ -0,0 +1,20 @@
package com.donetick.app.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import com.donetick.app.R;
/** "People" home-screen widget: every circle member with their task load. */
public class PeopleWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
for (int id : appWidgetIds) {
manager.updateAppWidget(id, WidgetUi.build(context, WidgetUi.MODE_PEOPLE, id));
}
// Reload rows; the factory refreshes from the server when stale, which
// is what keeps the widget current while the app stays closed.
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
}
}

View File

@@ -0,0 +1,47 @@
package com.donetick.app.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.widget.RemoteViews;
import com.donetick.app.R;
/**
* "Quick Capture" home-screen widget: three shortcuts straight into the
* add-task flow (type, scan, speak). Purely a launcher — it shows no task
* data, so it never needs a refresh cycle.
*/
public class QuickCaptureWidgetProvider extends AppWidgetProvider {
// Handled in src/CapacitorListener.js → /chores?add_task=1[&mode=…]
private static final String URI_TYPE = "donetick://chores/add";
private static final String URI_SCAN = "donetick://chores/add?mode=scan";
private static final String URI_VOICE = "donetick://chores/add?mode=voice";
@Override
public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
for (int id : appWidgetIds) {
manager.updateAppWidget(id, build(context));
}
}
private static RemoteViews build(Context context) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_quick_capture);
views.setOnClickPendingIntent(R.id.quick_type, deepLink(context, 10, URI_TYPE));
views.setOnClickPendingIntent(R.id.quick_scan, deepLink(context, 11, URI_SCAN));
views.setOnClickPendingIntent(R.id.quick_voice, deepLink(context, 12, URI_VOICE));
return views;
}
private static PendingIntent deepLink(Context context, int requestCode, String uri) {
Intent intent = new Intent(context, com.donetick.app.MainActivity.class);
intent.setAction(Intent.ACTION_VIEW);
// Distinct data per tile so the three PendingIntents aren't collapsed.
intent.setData(Uri.parse(uri));
return PendingIntent.getActivity(context, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
}
}

View File

@@ -0,0 +1,27 @@
package com.donetick.app.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import com.donetick.app.R;
/** "Today" home-screen widget: tasks due today plus anything awaiting approval. */
public class TodayWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
for (int id : appWidgetIds) {
manager.updateAppWidget(id, WidgetUi.build(context, WidgetUi.MODE_TODAY, id));
}
// Reload rows; the factory refreshes from the server when stale, which
// is what keeps the widget current while the app stays closed.
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
for (int id : appWidgetIds) {
WidgetStore.removeWidgetOptions(context, id);
}
}
}

View File

@@ -0,0 +1,25 @@
package com.donetick.app.widget;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import com.donetick.app.R;
/** "Next 7 Days" home-screen widget: upcoming tasks grouped by day. */
public class WeekWidgetProvider extends AppWidgetProvider {
@Override
public void onUpdate(Context context, AppWidgetManager manager, int[] appWidgetIds) {
for (int id : appWidgetIds) {
manager.updateAppWidget(id, WidgetUi.build(context, WidgetUi.MODE_WEEK, id));
}
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.widget_list);
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
for (int id : appWidgetIds) {
WidgetStore.removeWidgetOptions(context, id);
}
}
}

View File

@@ -0,0 +1,31 @@
package com.donetick.app.widget;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;
/**
* JS bridge for the home-screen widgets (see src/service/WidgetService.js).
* Persists the task snapshot + API config and redraws the widgets.
*/
@CapacitorPlugin(name = "WidgetBridge")
public class WidgetBridgePlugin extends Plugin {
@PluginMethod
public void update(PluginCall call) {
String data = call.getString("data");
String config = call.getString("config");
if (data != null) WidgetStore.saveData(getContext(), data);
if (config != null) WidgetStore.saveConfig(getContext(), config);
WidgetUi.refreshAll(getContext());
call.resolve();
}
@PluginMethod
public void clear(PluginCall call) {
WidgetStore.clear(getContext());
WidgetUi.refreshAll(getContext());
call.resolve();
}
}

View File

@@ -0,0 +1,48 @@
package com.donetick.app.widget;
import android.app.Activity;
import android.appwidget.AppWidgetManager;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Switch;
import com.donetick.app.R;
/**
* Placement / long-press configuration for the Today and Next 7 Days widgets.
* One option for now: include tasks assigned to other circle members
* (stored per appWidgetId so mixed setups work side by side).
*/
public class WidgetConfigActivity extends Activity {
private int appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
appWidgetId = getIntent().getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
// Cancelled result until Save, so backing out never adds a half-configured widget.
setResult(RESULT_CANCELED, resultIntent());
if (appWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID) {
finish();
return;
}
setContentView(R.layout.widget_config);
Switch includeOthers = findViewById(R.id.config_include_others);
includeOthers.setChecked(WidgetStore.includeOthers(this, appWidgetId));
findViewById(R.id.config_save).setOnClickListener(v -> {
WidgetStore.setIncludeOthers(this, appWidgetId, includeOthers.isChecked());
WidgetUi.refreshAll(this);
setResult(RESULT_OK, resultIntent());
finish();
});
}
private Intent resultIntent() {
return new Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
}
}

View File

@@ -0,0 +1,291 @@
package com.donetick.app.widget;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.view.View;
import android.widget.RemoteViews;
import android.widget.RemoteViewsService;
import androidx.core.content.ContextCompat;
import com.donetick.app.R;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/** Feeds task rows, day-group headers, and people rows to the widget ListView. */
public class WidgetListService extends RemoteViewsService {
@Override
public RemoteViewsFactory onGetViewFactory(Intent intent) {
String mode = intent.getStringExtra(WidgetUi.EXTRA_MODE);
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
return new WidgetListFactory(getApplicationContext(),
mode != null ? mode : WidgetUi.MODE_TODAY, appWidgetId);
}
static class Row {
final String header; // non-null for day-group headers
final WidgetStore.Task task; // non-null for task rows
final WidgetStore.Member person; // non-null for people rows
int todayCount;
int weekCount;
Row(String header, WidgetStore.Task task, WidgetStore.Member person) {
this.header = header;
this.task = task;
this.person = person;
}
}
static class WidgetListFactory implements RemoteViewsFactory {
private final Context context;
private final String mode;
private final int appWidgetId;
private List<Row> rows = new ArrayList<>();
private final Map<String, Bitmap> avatars = new HashMap<>();
private String myUserId;
private boolean includeOthers;
WidgetListFactory(Context context, String mode, int appWidgetId) {
this.context = context;
this.mode = mode;
this.appWidgetId = appWidgetId;
}
@Override
public void onCreate() {}
@Override
public void onDataSetChanged() {
// Runs on a binder thread, so synchronous network work is allowed
// here. This is the background-refresh path: the 30-minute
// updatePeriodMillis cycle lands here via notifyAppWidgetViewDataChanged.
boolean refreshed = WidgetStore.refreshFromServerIfStale(context);
myUserId = WidgetStore.userId(context);
includeOthers = WidgetStore.includeOthers(context, appWidgetId);
List<WidgetStore.Task> allTasks = WidgetStore.loadTasks(context);
List<WidgetStore.Member> members = WidgetStore.loadMembers(context);
if (WidgetUi.MODE_PEOPLE.equals(mode)) {
rows = buildPeopleRows(allTasks, members);
loadAvatars(members);
} else {
List<WidgetStore.Task> tasks =
WidgetStore.visibleTasks(context, allTasks, includeOthers);
rows = WidgetUi.MODE_TODAY.equals(mode)
? buildTodayRows(tasks)
: buildWeekRows(tasks);
if (includeOthers) loadAvatars(members);
}
if (refreshed) {
// Counts and "Updated …" line live outside the list.
WidgetUi.updateHeaders(context);
}
}
/** Resolve avatars for everyone up front — getViewAt must not block. */
private void loadAvatars(List<WidgetStore.Member> members) {
avatars.clear();
for (WidgetStore.Member member : members) {
avatars.put(member.id, AvatarCache.get(context, member));
}
}
private List<Row> buildTodayRows(List<WidgetStore.Task> tasks) {
List<Row> result = new ArrayList<>();
for (WidgetStore.Task task : WidgetStore.todaySubset(tasks)) {
result.add(new Row(null, task, null));
}
return result;
}
private List<Row> buildWeekRows(List<WidgetStore.Task> tasks) {
List<Row> result = new ArrayList<>();
long startOfToday = WidgetStore.endOfDay(-1) + 1;
SimpleDateFormat dayFormat = new SimpleDateFormat("EEE, MMM d", Locale.getDefault());
List<WidgetStore.Task> approvals = new ArrayList<>();
List<WidgetStore.Task> scheduled = new ArrayList<>();
for (WidgetStore.Task task : tasks) {
if (task.approval) approvals.add(task);
else if (task.dueDate != null) scheduled.add(task);
}
if (!approvals.isEmpty()) {
result.add(new Row(context.getString(R.string.widget_group_approval), null, null));
for (WidgetStore.Task task : approvals) result.add(new Row(null, task, null));
}
String currentGroup = null;
for (WidgetStore.Task task : scheduled) {
String group;
if (task.dueDate < startOfToday) {
group = context.getString(R.string.widget_group_overdue);
} else if (task.dueDate <= WidgetStore.endOfDay(0)) {
group = context.getString(R.string.widget_group_today);
} else if (task.dueDate <= WidgetStore.endOfDay(1)) {
group = context.getString(R.string.widget_group_tomorrow);
} else {
group = dayFormat.format(new Date(task.dueDate));
}
if (!group.equals(currentGroup)) {
result.add(new Row(group, null, null));
currentGroup = group;
}
result.add(new Row(null, task, null));
}
return result;
}
/** One row per member with today/week workloads, busiest first. */
private List<Row> buildPeopleRows(List<WidgetStore.Task> tasks,
List<WidgetStore.Member> members) {
List<Row> result = new ArrayList<>();
List<WidgetStore.Task> todayTasks = WidgetStore.todaySubset(tasks);
for (WidgetStore.Member member : members) {
Row row = new Row(null, null, member);
for (WidgetStore.Task task : tasks) {
if (member.id.equals(task.assignedTo)) row.weekCount++;
}
for (WidgetStore.Task task : todayTasks) {
if (member.id.equals(task.assignedTo)) row.todayCount++;
}
result.add(row);
}
java.util.Collections.sort(result, (a, b) -> {
if (a.todayCount != b.todayCount) return b.todayCount - a.todayCount;
if (a.weekCount != b.weekCount) return b.weekCount - a.weekCount;
return a.person.name.compareToIgnoreCase(b.person.name);
});
return result;
}
@Override
public RemoteViews getViewAt(int position) {
if (position < 0 || position >= rows.size()) return null;
Row row = rows.get(position);
if (row.header != null) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_row_day_header);
views.setTextViewText(R.id.row_day, row.header);
return views;
}
if (row.person != null) {
return buildPersonRow(row);
}
WidgetStore.Task task = row.task;
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_row_task);
views.setTextViewText(R.id.row_title, task.name);
boolean overdue = !task.approval && task.dueDate != null
&& task.dueDate < System.currentTimeMillis();
int secondary = ContextCompat.getColor(context, R.color.widget_text_secondary);
int warning = ContextCompat.getColor(context, R.color.widget_warning);
int danger = ContextCompat.getColor(context, R.color.widget_overdue);
String meta;
int metaColor;
if (task.approval) {
meta = context.getString(R.string.widget_meta_approval);
metaColor = warning;
} else if (overdue) {
meta = context.getString(R.string.widget_meta_overdue);
metaColor = danger;
} else {
meta = android.text.format.DateFormat.getTimeFormat(context)
.format(new Date(task.dueDate));
metaColor = secondary;
}
views.setTextViewText(R.id.row_meta, meta);
views.setTextColor(R.id.row_meta, metaColor);
int ringColor;
if (task.approval) ringColor = warning;
else if (overdue || task.priority == 1) ringColor = danger;
else if (task.priority == 2) ringColor = warning;
else ringColor = ContextCompat.getColor(context, R.color.widget_ring_neutral);
views.setInt(R.id.row_ring, "setColorFilter", ringColor);
// In "everyone" mode, show who a task belongs to (own tasks stay clean).
Bitmap avatar = includeOthers && task.assignedTo != null
&& !task.assignedTo.equals(myUserId)
? avatars.get(task.assignedTo)
: null;
if (avatar != null) {
views.setImageViewBitmap(R.id.row_avatar, avatar);
views.setViewVisibility(R.id.row_avatar, View.VISIBLE);
} else {
views.setViewVisibility(R.id.row_avatar, View.GONE);
}
Intent fillIn = new Intent();
fillIn.setData(Uri.parse("donetick://chores/" + task.id));
views.setOnClickFillInIntent(R.id.row_root, fillIn);
return views;
}
private RemoteViews buildPersonRow(Row row) {
RemoteViews views = new RemoteViews(context.getPackageName(),
R.layout.widget_row_person);
Bitmap avatar = avatars.get(row.person.id);
if (avatar == null) avatar = AvatarCache.initials(row.person);
views.setImageViewBitmap(R.id.person_avatar, avatar);
views.setTextViewText(R.id.person_name, row.person.name);
views.setTextViewText(R.id.person_counts, context.getString(
R.string.widget_person_counts, row.todayCount, row.weekCount));
// Highlight the today-count when someone has work due today.
int accent = ContextCompat.getColor(context, R.color.widget_accent);
int secondary = ContextCompat.getColor(context, R.color.widget_text_secondary);
views.setTextColor(R.id.person_counts, row.todayCount > 0 ? accent : secondary);
Intent fillIn = new Intent();
fillIn.setData(Uri.parse("donetick://chores"));
views.setOnClickFillInIntent(R.id.person_root, fillIn);
return views;
}
@Override
public RemoteViews getLoadingView() {
return null;
}
@Override
public int getViewTypeCount() {
return 3;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public int getCount() {
return rows.size();
}
@Override
public void onDestroy() {}
}
}

View File

@@ -0,0 +1,346 @@
package com.donetick.app.widget;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.time.OffsetDateTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
/**
* Shared storage + refresh logic for the home-screen widgets.
*
* The web app pushes a pre-filtered snapshot through WidgetBridgePlugin
* whenever its chores cache changes. When the app has not run for a while,
* {@link #refreshFromServerIfStale} re-fetches the list directly so the
* widget stays current in the background (driven by the 30-minute
* updatePeriodMillis cycle).
*
* Snapshot JSON: {version, lastUpdated,
* tasks:[{id, name, dueDate, priority, approval, assignedTo}],
* members:[{id, name, image}]}
* Config JSON: {serverUrl, token, userId}
*
* Since v2 the snapshot holds every member's tasks; widgets narrow it down to
* the current user unless the per-widget "include others" option is on.
*/
public final class WidgetStore {
private static final String TAG = "DonetickWidget";
private static final String PREFS = "donetick_widget";
private static final String KEY_DATA = "widget_tasks";
private static final String KEY_CONFIG = "widget_config";
private static final String KEY_INCLUDE_OTHERS_PREFIX = "include_others_";
// Same filtering window as src/service/WidgetService.js
private static final int WINDOW_DAYS = 7;
private static final int MAX_TASKS = 100;
// Don't hit the network if the app (or a previous refresh) updated the
// snapshot recently; also guards against notify->refresh loops.
private static final long STALE_MS = 10 * 60 * 1000;
private static final Object REFRESH_LOCK = new Object();
private WidgetStore() {}
public static class Task {
public String id;
public String name;
public Long dueDate; // epoch millis, null when unscheduled
public int priority;
public boolean approval;
public String assignedTo; // member userId, null when unassigned
}
public static class Member {
public String id;
public String name;
public String image; // avatar URL, may be null
}
private static SharedPreferences prefs(Context context) {
return context.getApplicationContext()
.getSharedPreferences(PREFS, Context.MODE_PRIVATE);
}
public static void saveData(Context context, String json) {
prefs(context).edit().putString(KEY_DATA, json).apply();
}
public static void saveConfig(Context context, String json) {
prefs(context).edit().putString(KEY_CONFIG, json).apply();
}
public static void clear(Context context) {
prefs(context).edit().clear().apply();
}
public static boolean hasConfig(Context context) {
return prefs(context).getString(KEY_CONFIG, null) != null;
}
/** The signed-in user's id from the pushed config, or null. */
public static String userId(Context context) {
try {
String raw = prefs(context).getString(KEY_CONFIG, null);
if (raw == null) return null;
Object id = new JSONObject(raw).opt("userId");
return id == null ? null : String.valueOf(id);
} catch (Exception e) {
return null;
}
}
/** Per-widget "include tasks assigned to others" option (default off). */
public static boolean includeOthers(Context context, int appWidgetId) {
return prefs(context).getBoolean(KEY_INCLUDE_OTHERS_PREFIX + appWidgetId, false);
}
public static void setIncludeOthers(Context context, int appWidgetId, boolean value) {
prefs(context).edit()
.putBoolean(KEY_INCLUDE_OTHERS_PREFIX + appWidgetId, value)
.apply();
}
public static void removeWidgetOptions(Context context, int appWidgetId) {
prefs(context).edit()
.remove(KEY_INCLUDE_OTHERS_PREFIX + appWidgetId)
.apply();
}
public static long lastUpdated(Context context) {
try {
String raw = prefs(context).getString(KEY_DATA, null);
if (raw == null) return 0;
return new JSONObject(raw).optLong("lastUpdated", 0);
} catch (Exception e) {
return 0;
}
}
public static List<Task> loadTasks(Context context) {
List<Task> tasks = new ArrayList<>();
try {
String raw = prefs(context).getString(KEY_DATA, null);
if (raw == null) return tasks;
JSONArray arr = new JSONObject(raw).optJSONArray("tasks");
if (arr == null) return tasks;
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.optJSONObject(i);
if (obj == null) continue;
Task task = new Task();
task.id = String.valueOf(obj.opt("id"));
task.name = obj.optString("name", "");
task.dueDate = obj.isNull("dueDate") ? null : obj.optLong("dueDate");
task.priority = obj.optInt("priority", 0);
task.approval = obj.optBoolean("approval", false);
// v1 snapshots carried only the user's own tasks and had no
// assignedTo — treat those rows as "mine".
task.assignedTo = obj.has("assignedTo")
? (obj.isNull("assignedTo") ? null : String.valueOf(obj.opt("assignedTo")))
: userId(context);
tasks.add(task);
}
} catch (Exception e) {
Log.e(TAG, "Failed to parse widget snapshot", e);
}
return tasks;
}
public static List<Member> loadMembers(Context context) {
List<Member> members = new ArrayList<>();
try {
String raw = prefs(context).getString(KEY_DATA, null);
if (raw == null) return members;
JSONArray arr = new JSONObject(raw).optJSONArray("members");
if (arr == null) return members;
for (int i = 0; i < arr.length(); i++) {
JSONObject obj = arr.optJSONObject(i);
if (obj == null) continue;
Member member = new Member();
member.id = String.valueOf(obj.opt("id"));
member.name = obj.optString("name", "");
member.image = obj.isNull("image") ? null : obj.optString("image", null);
members.add(member);
}
} catch (Exception e) {
Log.e(TAG, "Failed to parse widget members", e);
}
return members;
}
/**
* Tasks a today/week widget should render: everything when includeOthers,
* otherwise the user's own tasks plus approvals (which wait on them).
*/
public static List<Task> visibleTasks(Context context, List<Task> tasks, boolean includeOthers) {
if (includeOthers) return tasks;
String me = userId(context);
List<Task> mine = new ArrayList<>();
for (Task task : tasks) {
if (task.approval || (me != null && me.equals(task.assignedTo))) {
mine.add(task);
}
}
return mine;
}
/** Tasks the Today widget shows: awaiting approval, overdue, or due today. */
public static List<Task> todaySubset(List<Task> tasks) {
long endOfToday = endOfDay(0);
List<Task> subset = new ArrayList<>();
for (Task task : tasks) {
if (task.approval || (task.dueDate != null && task.dueDate <= endOfToday)) {
subset.add(task);
}
}
return subset;
}
public static long endOfDay(int daysFromNow) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, daysFromNow);
cal.set(Calendar.HOUR_OF_DAY, 23);
cal.set(Calendar.MINUTE, 59);
cal.set(Calendar.SECOND, 59);
cal.set(Calendar.MILLISECOND, 999);
return cal.getTimeInMillis();
}
/**
* Fetch /chores/ from the configured server and rebuild the snapshot.
* Returns true when a network refresh actually happened and succeeded.
* Safe to call from RemoteViewsFactory.onDataSetChanged (binder thread).
*/
public static boolean refreshFromServerIfStale(Context context) {
synchronized (REFRESH_LOCK) {
long age = System.currentTimeMillis() - lastUpdated(context);
if (age < STALE_MS) return false;
String rawConfig = prefs(context).getString(KEY_CONFIG, null);
if (rawConfig == null) return false;
HttpURLConnection connection = null;
try {
JSONObject config = new JSONObject(rawConfig);
String serverUrl = config.optString("serverUrl", "");
String token = config.optString("token", "");
if (serverUrl.isEmpty() || token.isEmpty()) return false;
URL url = new URL(serverUrl + "/chores/");
connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(10000);
connection.setReadTimeout(15000);
connection.setRequestProperty("Authorization", "Bearer " + token);
connection.setRequestProperty("Accept", "application/json");
if (connection.getResponseCode() != 200) {
// Expired token or server trouble — keep the last snapshot,
// the UI surfaces staleness via the "Updated …" line.
Log.w(TAG, "Widget refresh got HTTP " + connection.getResponseCode());
return false;
}
JSONArray chores = new JSONObject(readAll(connection.getInputStream()))
.optJSONArray("res");
if (chores == null) return false;
// The chores endpoint has no member profiles, so carry the
// member list over from the previous snapshot (it changes
// rarely and the app re-pushes it on every open).
JSONArray members = null;
String previous = prefs(context).getString(KEY_DATA, null);
if (previous != null) {
members = new JSONObject(previous).optJSONArray("members");
}
JSONObject snapshot = new JSONObject();
snapshot.put("version", 2);
snapshot.put("lastUpdated", System.currentTimeMillis());
snapshot.put("tasks", filterChores(chores));
snapshot.put("members", members == null ? new JSONArray() : members);
saveData(context, snapshot.toString());
return true;
} catch (Exception e) {
Log.w(TAG, "Widget background refresh failed", e);
return false;
} finally {
if (connection != null) connection.disconnect();
}
}
}
/** Mirror of buildWidgetTasks in src/service/WidgetService.js. */
private static JSONArray filterChores(JSONArray chores) throws Exception {
long cutoff = endOfDay(WINDOW_DAYS);
List<JSONObject> selected = new ArrayList<>();
for (int i = 0; i < chores.length(); i++) {
JSONObject chore = chores.optJSONObject(i);
if (chore == null || chore.opt("id") == null) continue;
boolean approval = chore.optInt("status", 0) == 3;
Long dueDate = parseDate(chore.optString("nextDueDate", null));
boolean inWindow = dueDate != null && dueDate <= cutoff;
if (!approval && !inWindow) continue;
JSONObject task = new JSONObject();
task.put("id", chore.opt("id"));
task.put("name", chore.optString("name", ""));
task.put("dueDate", dueDate == null ? JSONObject.NULL : dueDate);
task.put("priority", chore.optInt("priority", 0));
task.put("approval", approval);
task.put("assignedTo", chore.isNull("assignedTo")
? JSONObject.NULL
: String.valueOf(chore.opt("assignedTo")));
selected.add(task);
}
Collections.sort(selected, (a, b) -> {
boolean aApproval = a.optBoolean("approval");
boolean bApproval = b.optBoolean("approval");
if (aApproval != bApproval) return aApproval ? -1 : 1;
long aDue = a.isNull("dueDate") ? Long.MAX_VALUE : a.optLong("dueDate");
long bDue = b.isNull("dueDate") ? Long.MAX_VALUE : b.optLong("dueDate");
return Long.compare(aDue, bDue);
});
JSONArray result = new JSONArray();
for (int i = 0; i < selected.size() && i < MAX_TASKS; i++) {
result.put(selected.get(i));
}
return result;
}
private static Long parseDate(String value) {
if (value == null || value.isEmpty() || "null".equals(value)) return null;
try {
return OffsetDateTime.parse(value).toInstant().toEpochMilli();
} catch (Exception e) {
return null;
}
}
private static String readAll(InputStream stream) throws Exception {
StringBuilder builder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(stream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
}
return builder.toString();
}
}

View File

@@ -0,0 +1,141 @@
package com.donetick.app.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.View;
import android.widget.RemoteViews;
import com.donetick.app.MainActivity;
import com.donetick.app.R;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
/** Builds the shell RemoteViews shared by the widgets and pushes updates. */
public final class WidgetUi {
public static final String MODE_TODAY = "today";
public static final String MODE_WEEK = "week";
public static final String MODE_PEOPLE = "people";
public static final String EXTRA_MODE = "com.donetick.app.widget.MODE";
private WidgetUi() {}
/** Full refresh: redraw headers and reload list content (used by the JS bridge). */
public static void refreshAll(Context context) {
updateHeaders(context);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.notifyAppWidgetViewDataChanged(
widgetIds(context, manager, TodayWidgetProvider.class), R.id.widget_list);
manager.notifyAppWidgetViewDataChanged(
widgetIds(context, manager, WeekWidgetProvider.class), R.id.widget_list);
manager.notifyAppWidgetViewDataChanged(
widgetIds(context, manager, PeopleWidgetProvider.class), R.id.widget_list);
}
/** Redraw title/count/subtitle only — safe to call from the list factory. */
public static void updateHeaders(Context context) {
AppWidgetManager manager = AppWidgetManager.getInstance(context);
for (int id : widgetIds(context, manager, TodayWidgetProvider.class)) {
manager.updateAppWidget(id, build(context, MODE_TODAY, id));
}
for (int id : widgetIds(context, manager, WeekWidgetProvider.class)) {
manager.updateAppWidget(id, build(context, MODE_WEEK, id));
}
for (int id : widgetIds(context, manager, PeopleWidgetProvider.class)) {
manager.updateAppWidget(id, build(context, MODE_PEOPLE, id));
}
}
private static int[] widgetIds(Context context, AppWidgetManager manager, Class<?> provider) {
return manager.getAppWidgetIds(new ComponentName(context, provider));
}
public static RemoteViews build(Context context, String mode, int appWidgetId) {
boolean today = MODE_TODAY.equals(mode);
boolean people = MODE_PEOPLE.equals(mode);
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_shell);
int titleRes = today ? R.string.widget_today_title
: people ? R.string.widget_people_title
: R.string.widget_week_title;
views.setTextViewText(R.id.widget_title, context.getString(titleRes));
if (people) {
views.setViewVisibility(R.id.widget_count, View.GONE);
} else {
boolean includeOthers = WidgetStore.includeOthers(context, appWidgetId);
List<WidgetStore.Task> tasks = WidgetStore.visibleTasks(
context, WidgetStore.loadTasks(context), includeOthers);
int count = (today ? WidgetStore.todaySubset(tasks) : tasks).size();
views.setTextViewText(R.id.widget_count, String.valueOf(count));
views.setViewVisibility(R.id.widget_count, count > 0 ? View.VISIBLE : View.GONE);
}
views.setTextViewText(R.id.widget_subtitle, subtitle(context));
if (!WidgetStore.hasConfig(context)) {
views.setTextViewText(R.id.widget_empty,
context.getString(R.string.widget_signed_out));
} else {
int emptyRes = today ? R.string.widget_empty_today
: people ? R.string.widget_empty_people
: R.string.widget_empty_week;
views.setTextViewText(R.id.widget_empty, context.getString(emptyRes));
}
// The Today widget gets a quick-add button that deep links straight
// into the in-app AddTaskModal.
if (today) {
Intent addTask = new Intent(context, MainActivity.class);
addTask.setAction(Intent.ACTION_VIEW);
addTask.setData(Uri.parse("donetick://chores/add"));
views.setOnClickPendingIntent(R.id.widget_add, PendingIntent.getActivity(
context, 2, addTask,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
views.setViewVisibility(R.id.widget_add, View.VISIBLE);
} else {
views.setViewVisibility(R.id.widget_add, View.GONE);
}
// List content comes from WidgetListService; mode travels in the intent
// and the unique data URI keeps the adapters from being collapsed.
Intent adapterIntent = new Intent(context, WidgetListService.class);
adapterIntent.putExtra(EXTRA_MODE, mode);
adapterIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
adapterIntent.setData(Uri.parse("donetickwidget://" + mode + "/" + appWidgetId));
views.setRemoteAdapter(R.id.widget_list, adapterIntent);
views.setEmptyView(R.id.widget_list, R.id.widget_empty);
// Row taps deep link into the chore view; the row's fill-in intent
// supplies the donetick://chores/<id> data URI.
Intent rowTemplate = new Intent(context, MainActivity.class);
rowTemplate.setAction(Intent.ACTION_VIEW);
views.setPendingIntentTemplate(R.id.widget_list, PendingIntent.getActivity(
context, 1, rowTemplate,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE));
// Anywhere else on the widget simply opens the app.
Intent openApp = new Intent(context, MainActivity.class);
views.setOnClickPendingIntent(R.id.widget_container, PendingIntent.getActivity(
context, 0, openApp,
PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE));
return views;
}
private static String subtitle(Context context) {
String date = new SimpleDateFormat("EEE, MMM d", Locale.getDefault())
.format(new Date());
long lastUpdated = WidgetStore.lastUpdated(context);
if (lastUpdated <= 0) return date;
String time = android.text.format.DateFormat.getTimeFormat(context)
.format(new Date(lastUpdated));
return date + " · " + context.getString(R.string.widget_updated_at, time);
}
}

View File

@@ -0,0 +1 @@
{ "version": 1, "sessions": {} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/widget_bg" />
<!-- Match the launcher's system-wide widget corner radius on Android 12+ -->
<corners android:radius="@android:dimen/system_app_widget_background_radius" />
</shape>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/widget_accent">
<path
android:fillColor="@android:color/white"
android:pathData="M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z" />
</vector>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/widget_accent">
<path
android:fillColor="@android:color/white"
android:pathData="M12,14c1.66,0 3,-1.34 3,-3V5c0,-1.66 -1.34,-3 -3,-3S9,3.34 9,5v6C9,12.66 10.34,14 12,14z" />
<path
android:fillColor="@android:color/white"
android:pathData="M17,11c0,2.76 -2.24,5 -5,5s-5,-2.24 -5,-5H5c0,3.53 2.61,6.43 6,6.92V21h2v-3.08c3.39,-0.49 6,-3.39 6,-6.92H17z" />
</vector>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24"
android:tint="@color/widget_accent">
<!-- Framing corners plus a scan line: reads as "scan" at widget size. -->
<path
android:fillColor="@android:color/white"
android:pathData="M4,4h5v2H6v3H4V4zM15,4h5v5h-2V6h-3V4zM4,15h2v3h3v2H4V15zM18,15h2v5h-5v-2h3V15z" />
<path
android:fillColor="@android:color/white"
android:pathData="M3,11h18v2H3V11z" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/widget_bg" />
<corners android:radius="24dp" />
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/widget_accent_soft" />
<corners android:radius="10dp" />
</shape>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Initials disc stand-in for the picker previews; placed widgets get the
real cached avatars from AvatarCache. -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="@color/widget_accent_soft" />
<size android:width="28dp" android:height="28dp" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval">
<solid android:color="@android:color/transparent" />
<stroke android:width="2dp" android:color="#FFFFFF" />
<size android:width="18dp" android:height="18dp" />
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Tappable tile on the Quick Capture widget. -->
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
<solid android:color="@color/widget_accent_soft" />
<corners android:radius="18dp" />
</shape>

View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/widget_bg"
android:orientation="vertical"
android:padding="24dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_config_title"
android:textColor="@color/widget_text_primary"
android:textSize="22sp"
android:textStyle="bold" />
<Switch
android:id="@+id/config_include_others"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:minHeight="48dp"
android:text="@string/widget_config_include_others"
android:textColor="@color/widget_text_primary"
android:textSize="16sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="@string/widget_config_include_others_hint"
android:textColor="@color/widget_text_secondary"
android:textSize="13sp" />
<Button
android:id="@+id/config_save"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:backgroundTint="@color/widget_accent"
android:text="@string/widget_config_save"
android:textColor="#FFFFFF" />
</LinearLayout>

View File

@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Widget-picker preview for the People widget. See widget_preview_today.xml
for why the real shell can't be previewed directly. Avatars are initials
discs here; placed widgets get the real photos from AvatarCache.
Keep in visual sync with widget_shell.xml + widget_row_person.xml. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="14dp"
android:paddingBottom="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/preview_count"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_people_title"
android:textColor="@color/widget_text_primary"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/preview_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="@drawable/widget_count_bg"
android:gravity="center"
android:minWidth="22dp"
android:paddingStart="7dp"
android:paddingEnd="7dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:text="@string/widget_preview_count_people"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_updated"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:gravity="center_vertical"
android:minHeight="44dp"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="28dp"
android:layout_height="28dp"
android:background="@drawable/widget_preview_avatar"
android:gravity="center"
android:text="@string/widget_preview_initials_1"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_person_1"
android:textColor="@color/widget_text_primary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_counts_1"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="44dp"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="28dp"
android:layout_height="28dp"
android:background="@drawable/widget_preview_avatar"
android:gravity="center"
android:text="@string/widget_preview_initials_2"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_person_2"
android:textColor="@color/widget_text_primary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_counts_2"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="44dp"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<TextView
android:layout_width="28dp"
android:layout_height="28dp"
android:background="@drawable/widget_preview_avatar"
android:gravity="center"
android:text="@string/widget_preview_initials_3"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_person_3"
android:textColor="@color/widget_text_primary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_counts_3"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Widget-picker preview for the Today widget. Mirrors widget_shell.xml, but
with literal sample rows: the real shell fills its ListView from a
RemoteViewsFactory, which the picker never binds, so it would render blank.
Keep in visual sync with widget_shell.xml + widget_row_task.xml. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="14dp"
android:paddingBottom="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/preview_count"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_today_title"
android:textColor="@color/widget_text_primary"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/preview_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/preview_add"
android:background="@drawable/widget_count_bg"
android:gravity="center"
android:minWidth="22dp"
android:paddingStart="7dp"
android:paddingEnd="7dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:text="@string/widget_preview_count_today"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
<ImageView
android:id="@+id/preview_add"
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginStart="6dp"
android:background="@drawable/widget_count_bg"
android:contentDescription="@string/widget_add_task"
android:padding="5dp"
android:src="@drawable/ic_widget_add" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_updated"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_overdue" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_1"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_meta_overdue"
android:textColor="@color/widget_overdue"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_ring_neutral" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_2"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_meta_1"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_ring_neutral" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_3"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_meta_2"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,193 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Widget-picker preview for the Next 7 Days widget. See widget_preview_today.xml
for why the real shell can't be previewed directly. Keep in visual sync with
widget_shell.xml + widget_row_day_header.xml + widget_row_task.xml. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="14dp"
android:paddingBottom="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@+id/preview_count"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_week_title"
android:textColor="@color/widget_text_primary"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/preview_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:background="@drawable/widget_count_bg"
android:gravity="center"
android:minWidth="22dp"
android:paddingStart="7dp"
android:paddingEnd="7dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:text="@string/widget_preview_count_week"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
</RelativeLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_updated"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:letterSpacing="0.08"
android:paddingTop="8dp"
android:paddingBottom="2dp"
android:text="@string/widget_group_today"
android:textAllCaps="true"
android:textColor="@color/widget_text_secondary"
android:textSize="10sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_ring_neutral" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_1"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_meta_1"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_ring_neutral" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_2"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_meta_2"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="0.08"
android:paddingTop="8dp"
android:paddingBottom="2dp"
android:text="@string/widget_group_tomorrow"
android:textAllCaps="true"
android:textColor="@color/widget_text_secondary"
android:textSize="10sp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring"
android:tint="@color/widget_ring_neutral" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:text="@string/widget_preview_task_3"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/widget_preview_meta_1"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Quick Capture widget: three one-tap ways into the add-task flow. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/quick_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background"
android:orientation="vertical"
android:paddingStart="12dp"
android:paddingEnd="12dp"
android:paddingTop="12dp"
android:paddingBottom="12dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:baselineAligned="false"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/quick_type"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/widget_tile_bg"
android:contentDescription="@string/widget_quick_type"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@string/widget_quick_type"
android:src="@drawable/ic_widget_add" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:maxLines="1"
android:text="@string/widget_quick_type"
android:textColor="@color/widget_accent"
android:textSize="11sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:id="@+id/quick_scan"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/widget_tile_bg"
android:contentDescription="@string/widget_quick_scan"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@string/widget_quick_scan"
android:src="@drawable/ic_widget_scan" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:maxLines="1"
android:text="@string/widget_quick_scan"
android:textColor="@color/widget_accent"
android:textSize="11sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:id="@+id/quick_voice"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_marginStart="8dp"
android:layout_weight="1"
android:background="@drawable/widget_tile_bg"
android:contentDescription="@string/widget_quick_voice"
android:gravity="center"
android:orientation="vertical"
android:paddingTop="8dp"
android:paddingBottom="8dp">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:contentDescription="@string/widget_quick_voice"
android:src="@drawable/ic_widget_mic" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:maxLines="1"
android:text="@string/widget_quick_voice"
android:textColor="@color/widget_accent"
android:textSize="11sp"
android:textStyle="bold" />
</LinearLayout>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_day"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:letterSpacing="0.08"
android:paddingTop="8dp"
android:paddingBottom="2dp"
android:textAllCaps="true"
android:textColor="@color/widget_text_secondary"
android:textSize="10sp"
android:textStyle="bold" />

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/person_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="44dp"
android:orientation="horizontal"
android:paddingTop="5dp"
android:paddingBottom="5dp">
<ImageView
android:id="@+id/person_avatar"
android:layout_width="28dp"
android:layout_height="28dp"
android:importantForAccessibility="no" />
<TextView
android:id="@+id/person_name"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_primary"
android:textSize="14sp"
android:textStyle="bold" />
<TextView
android:id="@+id/person_counts"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
</LinearLayout>

View File

@@ -0,0 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/row_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:minHeight="40dp"
android:orientation="horizontal"
android:paddingTop="4dp"
android:paddingBottom="4dp">
<ImageView
android:id="@+id/row_ring"
android:layout_width="18dp"
android:layout_height="18dp"
android:importantForAccessibility="no"
android:src="@drawable/widget_ring" />
<TextView
android:id="@+id/row_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginEnd="8dp"
android:layout_weight="1"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_primary"
android:textSize="14sp" />
<TextView
android:id="@+id/row_meta"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/widget_text_secondary"
android:textSize="12sp" />
<!-- Assignee avatar, shown only in "everyone" mode for others' tasks. -->
<ImageView
android:id="@+id/row_avatar"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginStart="8dp"
android:importantForAccessibility="no"
android:visibility="gone" />
</LinearLayout>

View File

@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/widget_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/widget_background"
android:orientation="vertical"
android:paddingStart="16dp"
android:paddingEnd="16dp"
android:paddingTop="14dp"
android:paddingBottom="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/widget_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toStartOf="@id/widget_count"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_primary"
android:textSize="15sp"
android:textStyle="bold" />
<TextView
android:id="@+id/widget_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toStartOf="@+id/widget_add"
android:layout_centerVertical="true"
android:background="@drawable/widget_count_bg"
android:minWidth="22dp"
android:gravity="center"
android:paddingStart="7dp"
android:paddingEnd="7dp"
android:paddingTop="2dp"
android:paddingBottom="2dp"
android:textColor="@color/widget_accent"
android:textSize="12sp"
android:textStyle="bold" />
<!-- Quick-add, shown on the Today widget only (deep links to the
in-app AddTaskModal). Gone by default so the other widgets keep
the count pill flush with the edge. -->
<ImageView
android:id="@+id/widget_add"
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginStart="6dp"
android:background="@drawable/widget_count_bg"
android:contentDescription="@string/widget_add_task"
android:padding="5dp"
android:src="@drawable/ic_widget_add"
android:visibility="gone" />
</RelativeLayout>
<TextView
android:id="@+id/widget_subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="1dp"
android:ellipsize="end"
android:maxLines="1"
android:textColor="@color/widget_text_secondary"
android:textSize="11sp" />
<ListView
android:id="@+id/widget_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="6dp"
android:divider="@null"
android:dividerHeight="0dp"
android:listSelector="@android:color/transparent"
android:scrollbars="none" />
<TextView
android:id="@+id/widget_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:lineSpacingExtra="3dp"
android:textColor="@color/widget_text_secondary"
android:textSize="13sp"
android:visibility="gone" />
</LinearLayout>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background>
<inset android:drawable="@mipmap/ic_launcher_background" android:inset="16.7%" />
</background>
<foreground>
<inset android:drawable="@mipmap/ic_launcher_foreground" android:inset="16.7%" />
</foreground>
</adaptive-icon>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background>
<inset android:drawable="@mipmap/ic_launcher_background" android:inset="16.7%" />
</background>
<foreground>
<inset android:drawable="@mipmap/ic_launcher_foreground" android:inset="16.7%" />
</foreground>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 697 B

Some files were not shown because too many files have changed in this diff Show More