feat(preferences): frontend logic for user preferences

i think it would be better to wrap it into a form and use its `$dirty` flag